《C++ Primer》2第二部分学习笔记汇总容器与算法09至11章.docx
- 文档编号:9632724
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:22
- 大小:27.55KB
《C++ Primer》2第二部分学习笔记汇总容器与算法09至11章.docx
《《C++ Primer》2第二部分学习笔记汇总容器与算法09至11章.docx》由会员分享,可在线阅读,更多相关《《C++ Primer》2第二部分学习笔记汇总容器与算法09至11章.docx(22页珍藏版)》请在冰豆网上搜索。
《C++Primer》2第二部分学习笔记汇总容器与算法09至11章
《C++Primer》第二部分学习笔记汇总——容器与算法
《C++Primer》第09章学习笔记
第09章:
容器与算法
@学习摘录072:
顺序容器
——将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。
——vector支持快速随机访问
——list支持快速插入/删除
——deque双端队列
@学习摘录073:
顺序容器适配器
——适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。
——stack后进先出(LIFO)栈
——queue先进先出(FIFO)队列
——priority_queue有优先级管理的队列
第一节:
顺序容器的定义(初始化)
@学习摘录074:
新建一个容器初始化为另一个容器的副本
——vector
——vector
——list
ivecisnotlist
——vector
ivecholdsintnowdouble
——将一个容器复制给另一个容器时,类型必须匹配:
容器类型和元素类型都必须相同。
摘录有想074:
——这也就是说,容器复制的时候,只需考虑的是容器类型和元素类型,并不需要考虑原容器中的元素数量了,以前曾经想过这个问题。
也会想一个问题,在定义新容器的时候,会不会出现溢出的情况呢?
@学习摘录075:
初始化为一段元素的副本
——系统允许通过传递一对迭代器间接实现该功能。
使用迭代器时,不要求容器类型相同,容器内的元素类型也可以不相同,只要它们相互兼容能进行转换即可。
——//initializeslistwithcopyofeachelementofsvec
——list
——//findmidpointinthevector
——vector
:
iteratormid=svec.begin()+svec.size()/2;
——//initializefrontwithfirsthalfofsvec:
Theelementsuptobutnoteinclude*mid
——deque
——//initializebackwithsecondhalfofsvec:
Theelements*midthroughendofsvec
——deque
摘录有想075:
——利用迭代器复制相当的方便,减少了很多限制,还可以不同类型的复制,只是也要考虑到一个方面,稳定性,如果需要隐式转换的地方还是少用的好。
一段段的复制挺好的。
同时,注意考虑它的区间是左闭右开的区间来的。
@学习摘录076:
容器内元素的类型约束
——元素类型必须支持赋值运算。
——元素类型的对象必须可复制。
摘录有想076:
——这个问题,虽然不常发生,int型之类的内置类型不用考虑这个问题,而一些自己定义的类类型的话,真的得注意了。
@学习摘录077:
容器的容器
——定义容器的容器时,有一个问题必须得注意的:
——vector
spacerequiredbetweencblose>
——vector
>>treatedasshiftoperator
——必须用空格隔开两个相邻的>符号,以示这是两个分开的符号。
——否则,系统会认为>>是单个符号,为右移操作符,并结果导致编译时的错误。
摘录有想077:
——网上的帖子看过很多人出现这个错,经典错误啊,就一个空格之差,让人看得纠结,写程序时,细节决定成败。
第二节:
迭代器和迭代器范围
@学习摘录078:
迭代器范围
——C++语言使用一对迭代器标记迭代器范围,这两个迭代器分别指向同一个容器中的两个元素或超出末端的下一位置。
——通常,这两个迭代器命名为first和last,或 beg和end,用于标记容器中的一段元素范围。
——该范围内的元素包括迭代器first指向的元素,以及从first开始一直到迭代器last指向的位置之前的所有元素。
——此类元素范围称“左闭合区间(left-inclusiveinterval)表达式:
[first,last]
摘录有想078:
——要记得啊,常常出现的字眼“超出末端的下一位置”。
这一知识点,记住左闭区间是关键。
@学习摘录079:
使用左闭合区间的编程意义
——左闭合区间有两个方便使用的性质,得记住:
——1.当first与last相等时,迭代器范围为空;
——2.当first与last不相等时,迭代器范围内至少有一个元素,而first指向该区间的第一个元素。
——while(first!
=last)
——{//safetouse*firstbecauseweknowthereisatleastoneelement
——++first;
——}
摘录有想079:
——我想:
左闭合区间的使用,总的来说可以概括为三个字吧“安全性”。
第三节:
顺序容器的操作
——每种顺序容器都提供了一组有用的类型定义以及以下操作:
——1.在容器中添加元素
——2.在容器中删除元素
——3.设置容器的大小
——4.(如果有的话)获取容器内的第一个和最后一个元素。
@学习摘录080:
在顺序容器中添加元素
——在容器中添加元素时,系统是将元素值复制到容器里。
摘录有想080:
——这令我想到了指针,使用指针,改变的是值,而地址不变。
这个原理吧。
@学习摘录081:
在容器中的指定位置添加元素
——看代码后,你懂的!
s.insert(迭代器,插入的东西);新元素是插入在迭代器指向的位置之前。
返回指向新添加元素的迭代器。
——s.insert(iter,element);//insertelementjustbeforeiter
摘录有想081:
——考虑到有一种特例:
push_back和push_front可以相当于iter为s.begin()和s.end()时。
@学习摘录082:
插入一段元素
——看代码后,你懂的!
迭代器插入位置加上迭代器的前后位置构成的左闭合区间。
——stringsarray[4]={“quasi”,“samba”,“frollo”,“scar”};
——//insertalltheelementinsarrayatendofslist
——slist.insert(slist.end(),sarray,sarray+4);
@学习摘录083:
关系操作符(比较大小)
——/*
——ivec1:
1357912
——ivec2:
024681012
——ivec3:
139
——ivec4:
1357
——ivec5:
1357912
——*/
——//ivec1andivec2differatelement[0]:
ivec1greaterthanivec2
——//ivec1 ——//ivec2 ——//ivec1andivec3differatelement[2]: ivec1lessthanivec3 ——ivec1 ——//allelementsequal,butivec4hasfewerelements,soivec1isgreaterthanivec4 ——ivec1 ——ivec1==ivec5//true;eachelementequalandsamenumberofelements ——ivec1==ivec4//false;ivec4hasfewerelement ——ivec1! =ivec4//true;ivec4hasfewerelementsthanivec1 摘录有想083: ——很明显,在容器中,比较大小; ——1.逐位对比,先比大小。 (大者为大) ——2.再比容器长度。 (长者为大) @学习摘录084: 删除容器内所有的元素 ——slist.clear();//deletealltheelementwithinthecontainer ——slist.erase(slist.begin(),slist.end());//equivalent 摘录有想084: ——要删除容器内所有的元素,可以调用clear函数,或将begin和end迭代器传递给erase函数。 @学习摘录085: 容器中的赋值操作符 ——赋值操作符首先删除其左操作数容器中的所有元素; ——然后将右操作数容器的所有元素插入到左边容器中; ——赋值后,左右两边的容器相等; ——赋值前可能两个容器长度不相等,但赋值后两个容器都具有右操作数的长度。 ——c1=c2;//replacecontentsofc1withacopyofelementsinc2 ——//equivalentoperationusingeraseandinsert ——c1.erase(c1.begin(),c1.end());//deleteallelementsinc1 ——c1.insert(c1.begin(),c2.begin(),c2.end());//insertc2 @学习摘录086: 重设容器 ——c.assign(b,e)//重新设置c的元素: 将迭代器b和e标记的范围内所有的元素复制到c中。 b和e必须不是指向c中元素的迭代器。 ——c.assign(n,t)//将容器c重新设置为存储n个值为t的元素 ——//equivalentto: slist1.clear(); ——//followedbyslist1.insert(slist1.begin(),10,“Hiya! ”); ——slist1.assign(10,“Hiya! ”);//10elements;eachoneisHiya! ——执行了上述语句后,容器slist1有10个元素,每个元素的值都是Hiya! 摘录有想086: ——assign操作跟赋值操作符的操作原理差不多,都是先清空一个容器,然后再对已清空的容器进行插入操作。 @学习摘录087: 交换容器 ——swap操作实现交换两个容器内所有元素的功能。 ——vector ——vector ——svec1.swap(svec2); ——执行swap后,容器svec1中存储24个string类型的元素,而svec2则存储10个元素。 ——关于swap的一个重要问题: ——1.该操作不会删除或插入任何元素; ——2.保证在常量时间内实现交换。 ——3.由于容器内没有移动任何元素,因此迭代器不会失效。 摘录有想087: ——对此表示疑惑,为什么没有移动元素就没失效? 它的原理是? 猜测可能是变了变量的地址,其它一切无发生改变。 第四节: vector容器的自增长 @学习摘录088: vector的增长效率 ——为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些。 ——vector容器预留了这些额外的存储区,用于存放新添加的元素。 ——于是,不必为每个新元素重新分配容器。 ——所分配的额外内存容量的确切数目因库的实现不同而不同。 ——比起每添加一个新元素就必须重新分配一次容器,这个分配策略带来显著的效率。 ——事实上,其性能非常好,因此在实际应用中,比起list和deque容器,vector的增长效率通常会更高。 @学习摘录089: capacity成员 ——弄清capacity(容量)与size(长度)的区别非常重要。 ——size指容器当前拥有的元素个数; ——而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。 ——vector ——//sizeshouldbezero;capacityisimplementationdefined ——cout<<“ivec: size: “< ——<<“capacity: “< ——//giveivec24elements ——for(vector : size_typeix=0;ix! =24;++x) ——ivec.push_back(ix); ——//sizeshouldbe24;capacitywillbe>=24andisimplementationdefined ——cout<<“ivec: size: “< ——<<“capacity: “< ——结果: —— ivec: size: 0capacity: 0 —— ivec: size: 24capacity: 32 @学习摘录090: 选择容器 ——下面列举了四种选择容器的法则。 ——1.如果程序要求随机访问元素,则应使用vector或deque容器。 ——2.如果程序必须在容器的中间位置插入或删除元素,则应采用list容器。 ——3.如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器。 ——4.如果只需在读取输入时在容器的中间位置插入元素,然后需要随机记问元素,则可考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器。 第六节: string类型 @学习摘录091: string类型的查找操作 ——几乎所有的查找操作,返回的是string: : size_type类型的值,以下标形式标记查找匹配所发生的位置; ——当查找没有匹配值,将返回名为string: : npos的特殊值。 @学习摘录092: string类型的定义(一少部分) ——s.find(args)在s中查找args的第一次出现 ——s.find_first_of(args)在s中查找args的任意字符的第一次出现 ——s.find_last_of(args)在s中查找args的任意字符的最后一次出现 ——s.find_first_not_of(args)在s中查找第一个不属于args的字符 ——s.find_last_not_of(args)在s中查找最后一个不属于args的字符 摘录有想092: ——这几个定义,看上去,个人将其归纳两点: ——1.find操作可以分为第一次出现的关键字和最后次出现的关键字进行查找的标准。 ——2.find操作可以分为查找属于args的字符和不属于args的字符。 《C++Primer》第10章学习笔记 第10章: 关联容器 ——关联容器(associativecontainer)支持通过键来高效地查找和读取元素。 @学习摘录093: 关联容器和顺序容器的本质差别 ——关联容器通过键(key)存储和读取元素; ——顺序容器则通过元素在容器中的位置顺序存储和访问元素。 @学习摘录094: 关联容器的主要特点 ——关联容器的独特之处在于支持键的使用。 ——关联容器根据键的次序排。 ——在迭代遍历关联容器时,我们可以确保按键的顺序访问元素,而与元素在容器中的存放位置完全无关。 (与插入顺序也无关) @学习摘录095: 关联容器的类型 ——1.map 关联数组;元素通过键来存储和读取 ——2.set大小可变的集合,支持通过键实现的快速读取 ——3.multimap支持同一个键多次出现的map类型 ——4.multiset支持同一个键多次出现的set类型 @学习摘录096: 两种基本关联容器的基本特点 ——1.map的元素以键-值(key-value)对的形式组织。 —— 附: 键,用作元素在map的索引。 ——2.set仅包含一个键,能有效地支持关于某个键是否存在的查询。 @学习摘录097: 四种关联容器需要注意的地方 ——1.set和map类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素。 ——2.multimap和multiset类型允许多个元素拥有相同的键,即用于一个键必须对应多个实例的情况下。 (这两种类型不支持下标运算) 第一节: pair类型——#include @学习摘录098: pair的创建与初始化 ——pair ——pair @学习摘录099: pair对象的操作 ——pair类,可直接访问其数据成员: 成员都是公有的,分别命名为first和second ——pair ——elem.first=“OK”; ——elem.second=3; ——cout< @学习摘录100: 生成新的pair对象(make_pair) ——pair ——stringfirst,last; ——while(cin>>first>>last) ——{ ——//generateapairfromfirstandlast ——next_auth=make_pair(first,last); ——//processnext_auth.. ——} 第三节: map类型——#include ——map类型通常可理解为“关联数组”——通过键获取值,键-值相关联。 @学习摘录101: 键类型的约束 ——默认情况下标准库使用键类型定义<操作符来实现键的比较。 ——所用的比较函数必须在键类型上定义严格弱排序(strictweakordering) 摘录有想101: ——这也就是说,map @学习摘录102: map类定义的类型 ——map : key_type在map容器中,用作索引的键的类型 ——map : mapped_type在map容器中,键所关联的值的类型 ——map : value_type一个pair类型,它的first元素具有key_type类型,second元素具有mapped_type类型 @学习摘录103: map类定义类型的访问方法及需要注意的地方 ——当使用了map : value_type时,该类型中的key_type类型是const性质,不可修改。 ——当使用了map : iterator时,该类型中的key_type类型是const性质,不可修改。 摘录有想103: ——即 map : value_typevt;map : iterator=ok.begin(); ——vt->first;只能读取,不能赋值。 iterator->first也是只能读取不能赋值。 @学习摘录104: 下标在map中的行为 ——假如定义了一个名为ok的map ——用下标操作ok[“in”]=12会有以下结果: ——当in存在,赋ok->second值为12; ——当in不存在,新建(即插入)”in”元素并赋值为12. 摘录有想104: ——与顺序容器不同的一点是,用下标访问有可能会使map容器添加一个新的元素。 @学习摘录105: map中常用的insert操作 ——m.insert(make_pair(“ok”,12); ——m.insert(map : value_type(“ok”,1); ——m.inert(map : iteratora=m.begin(),map : iteratorb=++a); ——这三种操作,返回的都是void类型。 @学习摘录106: 查找map中的元素 ——m.find(k);返回迭代器,存在,返回符合位置的迭代器,不存在,返回超出末端迭代器。 ——m.count(k);返回m中k的出现次数。 摘录有想106: ——count操作根据map的性质,只能回返回0或1. @学习摘录107: 从map中删除元素 ——//eraseofakeyreturnsnumberofelementremoved ——if(word_count.erase(removal_word)) ——cout<<“ok: “< —— elsecout<<“oops: “< \n”; ——m.erase(k)删除m中键为k的元素。 返回size_type类型的值,表示删除的元素个数。 第五节: multimap和multiset类型 @学习摘录108: multimap和multiset类型元素的添加 ——由于键不要求是唯一的,因此每次调用insert总会添加一个元素。 ——multimap ——//addsfirstelemtwithkeya ——authors.insert(make_pair(string(“a”),string(“b”));
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ Primer C+ Primer2第二部分学习笔记汇总容器与算法09至11章 C+ Primer 第二 部分 学习 笔记 汇总 容器 算法 09 11