细嚼慢咽C++primer(5)——顺序容器
1 顺序容器的定义
容器是容纳特定类型对象的集合。
顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。
标准库的三种顺序容器类型:vector, list 和 deque。
适配器:stack,queue和priority_queue类型。适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。
头文件:
#include<vector>
#include<list>
#include<deque>
所有的容器都是类模板,要定义某种特殊的容器,必须在容器名后加一对尖括号,尖括号里面提供容器中存放的元素的类型:
vector<string> svec;
list<int> ilist;
deque<Sale_item> items;
容器类型最好使用默认构造函数。
2 四种创建和初始化vector对象的方式
vector<int> ivec1(6);
vector<int> ivec2(6,1);
vector<int> ivec3(ia, ia+6);
vector<int> ivec4(ivec1);
Q:复制容器对象的构造函数和使用两个迭代器的构造函数之间的差别。
A: 复制容器对象的构造函数只能在相同类型的容器间进行完全的复制,而使用迭代器的构造函数可以将一个容器的子序列赋值给另一个容器,并且容器的类型也不要求必须相同,只要容器中的元素可以兼容即可。
3 容器内元素的类型约束
- 元素类型必须支持赋值运算
- 元素类型的对象必须可以复制
除了引用类型外,所有内置或符合类型都可用做元素类型,引用不支持一般意义的赋值运算,因此所有元素是引用类型的容器。
IO库类型不支持复制和赋值, 所以,不能创建存放IO类型对象的容器,
容器的容器:
vector< vector<string> > lines;
必须用空格隔开两个相邻的 > 符号,以示这是两个分开的符号。
4 迭代器和迭代器范围
Q: 下面的程序错在哪里?如何更正?
list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
iter2 = lst1.end();
while (iter1 < iter2)
........
A: list容器的迭代器不支持关系操作符,关系操作符只属用于vector和deque容器。
4.1 迭代器范围
迭代器范围,标记同一个容器中的两个元素或超出末端的下一位置,通常命名它们为first和last, 或begin和end。
其中,第二个迭代器从来都不是指向元素范围的最后一个元素,而是指向最后一个元素的下一位置。
对形成迭代器范围的两个迭代器的要求:
- 它们指向同一个容器中的元素或超出末端的下一个位置;
- 如果这两个迭代器不相等,则对first反复做自增运算必须能够到达last, 换句话说,在容器中,last绝对不能位于first之前。
4.2 迭代器失效
使用迭代器编写程序时,必须留意哪些操作会使迭代器失效,使用无效的迭代器将会导致严重的运行时错误。
任何insert或push操作都可能导致迭代器失效,当编写循环将元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。
4.3 容器间的比较
比较规则:
如果两个容器具有相同的长度,而且所有元素都相等,那么这两个容器就相等,否则,它们就不相等;
如果两个容器的长度不相同,但较短的容器中所有元素都等于较长容器中对应的元素,则称较短的容器小宇另一个容器;
如果两个容器都不是对方的初始子序列,则它们的比较结果取决于所比较的第一个不相等的元素。
4.4 vector容器的内存分配,size和capacity的区别
虽然一直都是在说一些基础的东西,但是容器的操作网上很多,很容易查得到,就不再赘述。说一说vector容器是如何实现内存的快速分配的吧。
为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需要的空间要多一些。预留的这个空间是为了存放新添加的元素。
vector<int> ivec;
ivec.size(); // 所保存的元素数目
ivec.capacity(); //实际可以容纳的元素数目
所以一般来说,capacity比size要大一些。
总结一句话就是,通常来说,除非找到选择使用其他容器的更好的理由,否则vector容器都是最佳的选择。
细嚼慢咽C++primer(5)——顺序容器的更多相关文章
- C++ Primer 笔记——顺序容器
1.标准库中定义了一些顺序容器,所有顺序容器都提供了快速顺序访问元素的能力. 2.如果容器的元素类型没有默认构造函数,那么在构造这个容器的时候不能只指定这个容器的数目,因为没有办法默认构造这些元素. ...
- c++ primer 9 顺序容器
定义: #include <vector> #include <list> #include <deque> vector<int> svec; lis ...
- C++ Primer 第九章 顺序容器
由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...
- C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题
顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...
- C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap
顺序容器属于C++ STL的一部分,也是非常重要的一部分. 顺序容器包括: std::vector,包含在头文件<vector>中 std::string, 包含在头文件<strin ...
- C++ Primer 随笔 Chapter 9 顺序容器
参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...
- C++ Primer 5th 第9章 顺序容器
练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...
- C++ Primer 读书笔记: 第9章 顺序容器
第9章 顺序容器 引: 顺序容器: vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器: stack 后进先出栈 queue 先进先出队列 priori ...
- C++ Primer 有感(顺序容器)
1.顺序容器的元素排列次序与元素的值无关,而是由元素添加到容器里的次序决定. 2. 顺序容器 vector 支持快速随机访问 list ...
随机推荐
- redis 实现消息发布和订阅
1,打开二个客户端机器 一个用于发布,一个用于接受 2,发布一个channel1 3,用另外一个客户端收听上面的客户端 4,当再次在发布的redis客户端 发布一个消息 其他所有订阅的客户端会自动收 ...
- 四大组件之Activity Task任务栈4种启动模式
1.启动模式 standard,创建一个新的Activity. singleTop,栈顶不是该类型的Activity,创建一个新的Activity.否则,onNewIntent. singleTask ...
- 执行Hive时出现org.apache.hadoop.util.RunJar.main(RunJar.java:136) Caused by: java.lang.NumberFormatException: For input string: "1s"错误的解决办法(图文详解)
不多说,直接上干货 问题详情 [kfk@bigdata-pro01 apache-hive--bin]$ bin/hive Logging initialized -bin/conf/hive-log ...
- Oracle数据库调优总结
oracle采用物理读和逻辑读,第一次查询数据库采用的是物理读,以后如果使用相同的sql语句查询,那么它会采用逻辑读,直接从内存中读取数据. 采用执行计划查看执行顺序和耗时:一般查看object na ...
- Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们本身只是HTTP中的一个配置项,在servlet规范中也只对应一个类而已. 理解 Cookie 通俗地说就是当一 ...
- TimerJob无法发布新版本问题
最近遭遇发布TimerJob在测试环境发布没有问题,但是到正式环境发布总是无法执行及调试的问题,经过几天的努力,终于解决了这个问题,下面记录下遭遇的问题. Windows 2008,SharePoin ...
- C++实现顺序查找,折半查找,插值查找
1.顺序查找 从数组起始扫描到数组结尾,判断该索引数组是否和关键字相等,成功返回1 代码如下: //顺序查找 int seqSearch(int *array, int low, int high, ...
- 数据存储之第三方FMDB优化
最近项目要用到数据库,采用的是第三方FMDB, 之前做C#时用过sqlHelper,自己就按着sqlHelper的思路封装了一下,封装的也比较简单,看到网上有一些根据FMDB封装的ORM框架,但基本都 ...
- IOS runtime动态运行时一
对运行时不太了解,今天小伙伴橄榄油陈高给发了个链接 ,看了一部分先存着以后慢慢品 http://www.cocoachina.com/ios/20141018/9960.html http://blo ...
- 常用 JavaScript 小技巧及原理详解
善于利用JS中的小知识的利用,可以很简洁的编写代码 1. 使用!!模拟Boolean()函数 原理:逻辑非操作一个数据对象时,会先将数据对象转换为布尔值,然后取反,两个!!重复取反,就实现了转换为布尔 ...