1 顺序容器的定义

容器是容纳特定类型对象的集合。

顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。

标准库的三种顺序容器类型:vector, list 和 deque。

适配器:stack,queue和priority_queue类型。适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。

头文件:

  1. #include<vector>
  2. #include<list>
  3. #include<deque>

所有的容器都是类模板,要定义某种特殊的容器,必须在容器名后加一对尖括号,尖括号里面提供容器中存放的元素的类型:

  1. vector<string> svec;
  2. list<int> ilist;
  3. deque<Sale_item> items;

容器类型最好使用默认构造函数。

2 四种创建和初始化vector对象的方式

  1. vector<int> ivec1(6);
  2. vector<int> ivec2(6,1);
  3. vector<int> ivec3(ia, ia+6);
  4. vector<int> ivec4(ivec1);
  1. Q:复制容器对象的构造函数和使用两个迭代器的构造函数之间的差别。
  2. A: 复制容器对象的构造函数只能在相同类型的容器间进行完全的复制,而使用迭代器的构造函数可以将一个容器的子序列赋值给另一个容器,并且容器的类型也不要求必须相同,只要容器中的元素可以兼容即可。

3 容器内元素的类型约束

  • 元素类型必须支持赋值运算
  • 元素类型的对象必须可以复制

除了引用类型外,所有内置或符合类型都可用做元素类型,引用不支持一般意义的赋值运算,因此所有元素是引用类型的容器。

IO库类型不支持复制和赋值, 所以,不能创建存放IO类型对象的容器,

容器的容器:

  1. vector< vector<string> > lines;

必须用空格隔开两个相邻的 > 符号,以示这是两个分开的符号。

4 迭代器和迭代器范围

Q: 下面的程序错在哪里?如何更正?

  1. list<int> lst1;
  2. list<int>::iterator iter1 = lst1.begin(),
  3. iter2 = lst1.end();
  4. while (iter1 < iter2)
  5. ........

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容器实现快速的内存分配,其实际分配的容量要比当前所需要的空间要多一些。预留的这个空间是为了存放新添加的元素。

  1. vector<int> ivec;
  2. ivec.size(); // 所保存的元素数目
  3. ivec.capacity(); //实际可以容纳的元素数目

所以一般来说,capacity比size要大一些。

  1. 总结一句话就是,通常来说,除非找到选择使用其他容器的更好的理由,否则vector容器都是最佳的选择。

细嚼慢咽C++primer(5)——顺序容器的更多相关文章

  1. C++ Primer 笔记——顺序容器

    1.标准库中定义了一些顺序容器,所有顺序容器都提供了快速顺序访问元素的能力. 2.如果容器的元素类型没有默认构造函数,那么在构造这个容器的时候不能只指定这个容器的数目,因为没有办法默认构造这些元素. ...

  2. c++ primer 9 顺序容器

    定义: #include <vector> #include <list> #include <deque> vector<int> svec; lis ...

  3. C++ Primer 第九章 顺序容器

    由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...

  4. C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题

    顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...

  5. C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap

    顺序容器属于C++ STL的一部分,也是非常重要的一部分. 顺序容器包括: std::vector,包含在头文件<vector>中 std::string, 包含在头文件<strin ...

  6. C++ Primer 随笔 Chapter 9 顺序容器

     参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...

  7. C++ Primer 5th 第9章 顺序容器

    练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...

  8. C++ Primer 读书笔记: 第9章 顺序容器

    第9章 顺序容器 引: 顺序容器: vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器: stack 后进先出栈 queue 先进先出队列 priori ...

  9. C++ Primer 有感(顺序容器)

    1.顺序容器的元素排列次序与元素的值无关,而是由元素添加到容器里的次序决定. 2. 顺序容器 vector                               支持快速随机访问 list   ...

随机推荐

  1. 比特 字节 兆 GB转换

    bit:比特byte:拜特(字节) 1字节=8比特k:千KB:千字节 1KB = 1024 byteMB:兆字节GB:千兆字节 //少用 Kb:千比特 Mb:兆比特 Gb:千兆比特

  2. 深度学习(十三) R-CNN Fast RCNN

    object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...

  3. PL/SQL:these query result are not updateable,include the ROWID to get updateab -----for update

    these query result are not updateable,include the ROWID to get updateab 原因: 其实,选中一个表后,右键,如果选择“query ...

  4. java并发编程(5)并发程序测试

    并发程序测试 一.正确性测试 如:对一个自定义缓存的测试 //自定义的缓存 public class SemaphoreBoundedBuffer <E> { private final ...

  5. 使用javascript获取wx.config内部字段解决微信分享

    背景 在微信分享开发的时候我们通常的流程是 <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppI ...

  6. Devexpress GridView增加CheckBox列

    参考DEV官网代码做了一个增加checkbox列效果: #region 方法:设置GridView数据绑定        public void GridDataBind()        {     ...

  7. zabbix使用(自定义监控、自动报警)

    自定义监控(制作模板) zabbix自带模板Template OS Linux (Template App Zabbix Agent)提供CPU.内存.磁盘.网卡等常规监控,只要新加主机关联此模板,就 ...

  8. 分布式ID生成器PHP+Swoole实现(下) - 代码实现

    上篇文章主要介绍<实现原理>,这篇看主要代码的编写. 实现IDGenerator类 64位ID由以下元素组成:固定位占2位,时间戳占41位,服务实例数字编号占4位,业务编号占10位,自增i ...

  9. 撩课-Python-每天5道面试题-第3天

    一. 代码实现: 计算1到100之间, 所有的奇数之和 result = , ): result += i print(result) 二. 代码实现: 接收用户输入数字, 求出从0至这个数字的累加和 ...

  10. 30分钟掌握ES6/ES2015核心内容[上和下], 不错的说

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...