付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 C+ Primer第 09 章学习笔记 第 09 章:容器与算法 学习摘录 072:顺序容器 将单一类型元素聚集起来成为容器, 然后根据位置来存储和访问这些元素, 这就是顺序容器。 vector 支持快速随机访问 list 支持快速插入 / 删除 deque 双端队列 学习摘录 073:顺序容器适配器 适配器是根据原始的容器类型所提供的操作, 通过定义新的操作接口, 来适应基础的容器类型。 stack 后进先出( LIFO)栈 queue 先进先出( FIFO)队列 priority_queue 有优先级管理的队列 第一节:顺序容器的定义(初始化) 学习摘录 074:新建一个容器初始化为另一
2、个容器的副本 vector ivec; vector ivec2(ivec); / ok, ivec is vector list ilist(ivec); / error: ivec is not list vector dvec(ivec); / error: ivec holds int now double 将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同。 摘录有想 074: 这也就是说, 容器复制的时候, 只需考虑的是容器类型和元素类型, 并不需要考虑原容 器中的元素数量了, 以前曾经想过这个问题。 也会想一个问题,在定义新容器的时候, 会不 会出现溢出的情
3、况呢? 学习摘录 075:初始化为一段元素的副本 系统允许通过传递一对迭代器间接实现该功能。使用迭代器时,不要求容器类型相同,容器内的元素类型也可以不相同,只要它们相互兼容能进行转换即可。 / initialize slist with copy of each element of svec list slist(svec.begin(), svec.end() ); / find midpoint in the vector vector:iterator mid = svec.begin() + svec.size() / 2; / initialize front with first
4、 half of svec: The elements up to but note include *mid deque front(svec.begin(), mid); / initialize back with second half of svec: The elements *mid through end of svec deque back(mid, svec.end() ); 摘录有想 075: 利用迭代器复制相当的方便, 减少了很多限制, 还可以不同类型的复制, 只是也要考虑 到一个方面, 稳定性,如果需要隐式转换的地方还是少用的好。 一段段的复制挺好的。 同时, 注意考
5、虑它的区间是左闭右开的区间来的。 学习摘录 076:容器内元素的类型约束 元素类型必须支持赋值运算。 元素类型的对象必须可复制。 摘录有想 076: 这个问题,虽然不常发生, int 型之类的内置类型不用考虑这个问题,而一些自己定义的类类型的话,真的得注意了。 学习摘录 077:容器的容器 定义容器的容器时,有一个问题必须得注意的: vector vector lines; / ok:space required between cblose vectorvector lines; / error: treated as shift operator 必须用空格隔开两个相邻的 符号,以示这是两
6、个分开的符号。否则,系统会认为 是单个符号,为右移操作符,并结果导致编译时的错误。摘录有想 077: 网上的帖子看过很多人出现这个错, 经典错误啊,就一个空格之差,让人看得纠结,写程序时,细节决定成败。 第二节:迭代器和迭代器范围 学习摘录 078:迭代器范围 C+语言使用一对迭代器标记迭代器范围,这两个迭代器分别指向同一个容器中的两个 元素或超出末端的下一位置。 通常,这两个迭代器命名为 first 和 last,或 beg 和 end,用于标记容器中的一段元素范 围。 该范围内的元素包括迭代器 first 指向的元素,以及从 first 开始一直到迭代器 last 指向 的位置之前的所有元
7、素。 此类元素范围称“左闭合区间( left -inclusive interval )表达式: first, last 摘录有想 078: 要记得啊,常常出现的字眼“超出末端的下一位置” 。这一知识点,记住左闭区间是关 键。 学习摘录 079:使用左闭合区间的编程意义 左闭合区间有两个方便使用的性质,得记住: 1. 当 first 与 last 相等时,迭代器范围为空; 2. 当 first 与 last 不相等时, 迭代器范围内至少有一个元素, 而 first 指向该区间的第一 个元素。 while(first != last) / safe to use *first because w
8、e know there is at least one element +first; 摘录有想 079: 我想:左闭合区间的使用,总的来说可以概括为三个字吧“安全性” 。 第三节:顺序容器的操作 每种顺序容器都提供了一组有用的类型定义以及以下操作: 1. 在容器中添加元素 2. 在容器中删除元素 3. 设置容器的大小 4. (如果有的话)获取容器内的第一个和最后一个元素。 学习摘录 080:在顺序容器中添加元素 在容器中添加元素时,系统是将元素值复制到容器里。 摘录有想 080: 这令我想到了指针,使用指针,改变的是值,而地址不变。这个原理吧。 学习摘录 081:在容器中的指定位置添加元素
9、 看代码后,你懂的! s.insert( 迭代器 , 插入的东西 ); 新元素是插入在迭代器指向的位置之前。返回指向新添加元素的迭代器。 s.insert(iter, element); / insert element just before iter 摘录有想 081: 考虑到有一种特例: push_back 和 push_front 可以相当于 iter 为 s.begin() 和 s.end() 时。 学习摘录 082:插入一段元素 看代码后,你懂的!迭代器插入位置加上迭代器的前后位置构成的左闭合区间。 string sarray4 = “quasi ”, “samba”, “frol
10、lo ”, “scar ”; / insert all the element in sarray at end of slist slist.insert(slist.end(), sarray, sarray + 4); 学习摘录 083:关系操作符(比较大小) /* ivec1: 1 3 5 7 9 12 ivec2: 0 2 4 6 8 10 12 ivec3: 1 3 9 ivec4: 1 3 5 7 ivec5: 1 3 5 7 9 12 */ / ivec 1 and ivec2 differ at element0: ivec1 greater than ivec2 / ive
11、c1 ivec2 / false / ivec2 ivec1 / true / ivec1 and ivec3 differ at element2: ivec1 less than ivec3 ivec1 ivec3 / true / all elements equal, but ivec4 has fewer elements, so ivec1 is greater than ivec4 ivec1 ivec4 / false ivec1 = ivec5 / true; each element equal and same number of elements ivec1 = ive
12、c4 / false; ivec4 has fewer element ivec1 != ivec4 / true; ivec4 has fewer elements than ivec1 摘录有想 083: 很明显,在容器中,比较大小; .逐位对比,先比大小。 (大者为大) .再比容器长度。 (长者为大) 学习摘录 084:删除容器内所有的元素 slist.clear(); / delete all the element within the container slist.erase(slist.begin(), slist.end() ); / equivalent 摘录有想 084:
13、 要删除容器内所有的元素,可以调用 clear 函数,或将 begin 和 end 迭代器传递给 erase 函数。 学习摘录 085:容器中的赋值操作符 赋值操作符首先删除其左操作数容器中的所有元素; 然后将右操作数容器的所有元素插入到左边容器中; 赋值后,左右两边的容器相等; 赋值前可能两个容器长度不相等,但赋值后两个容器都具有右操作数的长度。 c1 = c2; / replace contents of c1 with a copy of elements in c2 / equivalent operation using erase and insert c1.erase(c1.be
14、gin(), c1.end() ); / delete all elements in c1 c1.insert(c1.begin(), c2.begin(), c2.end() ); / insert c2 学习摘录 086:重设容器 c.assign(b,e) / 重新设置 c 的元素:将迭代器 b 和 e 标记的范围内所有的元素复制到 中。 b 和 e 必须不是指向 c 中元素的迭代器。 c.assign(n, t) / 将容器 c 重新设置为存储 n 个值为 t 的元素 / equivalent to: slist1.clear(); / followed by slist1.inse
15、rt(slist1.begin(), 10, “Hiya! ”); c slist1.assign(10,“Hiya! ”); / 10 elements; each one is Hiya! 执行了上述语句后,容器 slist1 有 10 个元素,每个元素的值都是 Hiya! 摘录有想 086: assign 操作跟赋值操作符的操作原理差不多,都是先清空一个容器,然后再对已清空的容器进行插入操作。 学习摘录 087:交换容器 swap 操作实现交换两个容器内所有元素的功能。 vector svec1(10); / vector with 10 elements vector svec2(24
16、); / vector with 24 elements svec1.swap(svec2); 执行 swap 后,容器 svec1 中存储 24 个 string 类型的元素, 而 svec2 则存储 10 个元素。 关于 swap 的一个重要问题: 1.该操作不会删除或插入任何元素; 2.保证在常量时间内实现交换。 3.由于容器内没有移动任何元素,因此迭代器不会失效。 摘录有想 087: 对此表示疑惑, 为什么没有移动元素就没失效?它的原理是?猜测可能是变了变量的地址,其它一切无发生改变。 第四节: vector 容器的自增长 学习摘录 088:vector 的增长效率 为了使 vecto
17、r 容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些。 vector 容器预留了这些额外的存储区,用于存放新添加的元素。于是,不必为每个新元素重新分配容器。所分配的额外内存容量的确切数目因库的实现不同而不同。比起每添加一个新元素就必须重新分配一次容器,这个分配策略带来显著的效率。 事实上,其性能非常好,因此在实际应用中,比起 list 和 deque 容器, vector 率通常会更高。 的增长效 学习摘录 089:capacity 成员 弄清 capacity(容量)与 size(长度)的区别非常重要。 size 指容器当前拥有的元素个数; 而 capacity 则指容器在必
18、须分配新存储空间之前可以存储的元素总数。 vector ivec; / size should be zero; capacity is implementation defined cout “ivec: size: “ ivec.size() “ capacity: “ ivec.capacity() endl; / give ivec 24 elements for (vector:size_type ix = 0; ix != 24; +x) ivec.push_back(ix); / size should be 24; capacity will be = 24 and is implementation defined cout “ivec: size: “ ivec.size() “ capacity: “ ivec.capacity() endl; 结果: ivec:size: 0 capacity: 0 ivec: size: 24 capacity: 32 学习摘录 090:选择容器 下面列举了四种选择容器的法则。 1. 如果程序要求随机访问元素,则应使用 vector 或 deque 容器。 2. 如果程序必须在容器的中间位置插入或删除元素,则应采用 list 容器。 3. 如果程序不是在容器的中间位置,而是在容器首部或尾部插
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年武威市凉州区医疗系统事业编人员招聘笔试参考题库及答案详解
- 人教版四年级上册语文《期末》考试卷及完整答案
- 2026年西藏自治区日喀则市工会人员招聘考试参考试题及答案详解
- 2026福建省药材有限责任公司招聘1人笔试模拟试题及答案详解
- 2026年福建省泉州市工会人员招聘考试参考试题及答案详解
- 2026年汕头市潮阳区政务服务中心(窗口人员)招聘笔试模拟试题及答案详解
- 2026年襄樊市樊城区政务服务中心(窗口人员)招聘笔试模拟试题及答案详解
- 2026年杭州市滨江区工会人员招聘考试参考题库及答案详解
- 2026年保山市隆阳区政务服务中心(窗口人员)招聘考试参考试题及答案详解
- 2026年珠海市拱北区政务服务中心(窗口人员)招聘笔试模拟试题及答案详解
- 《物理化学》教学课件上册白守礼版
- 辅助生殖妊娠营养干预
- 极兔快运java面试题及答案
- 原创国内外药用新辅料应用及发展趋势
- 电信考试题目及答案
- 塔吊十不吊培训
- 桶装水采购合同2025年
- 拖欠工程款上访信范文
- 《中国当代文学1》课程教学大纲
- 艺术涂料施工协议
- 医师定期考核(临床医师)-医师定期考核真题
评论
0/150
提交评论