1.标准库中定义了一些顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。

2.如果容器的元素类型没有默认构造函数,那么在构造这个容器的时候不能只指定这个容器的数目,因为没有办法默认构造这些元素。

3.常见的一些容器操作

4.当一个容器初始化另一个容器拷贝时,两个容器的元素类型必须完全匹配,如果用一个容器的迭代器去初始化另一个容器时,只要元素类型可以转换即可。

5.当定义一个array时除了指定类型之外还要定义它的大小,array可以进行拷贝赋值。

std::array<int, > arr = {, , };
std::array<int, >::iterator iter;
std::array<int, > arr1 = arr;

6.容器的赋值运算。

7.assign(array不可用)可以为类型不同但是相容的容器赋值。

std::list<std::string> names;
std::vector<const char*> oldstyle;
names = oldstyle; // 错误,类型不同
names.assign(oldstyle.cbegin(), oldstyle.cend());

8.除array外,swap不对任何元素进行拷贝,删除或插入操作,因此可以保证在常数时间完成。

  • 元素不被移动意味着,除string外,指向容器的迭代器,引用和指针在swap操作之后都不会失效,但是已经指向的容器已经随着元素发生变化。
  • 对string调用swap会导致迭代器,引用和指针失效。
  • swap两个array会真正交换它们的元素,因此交换两个array所需的时间与array的元素数目成正比,而且指针,引用和迭代器所绑定的元素保持不变,但元素的值变了。

9.关系运算符两边的运算对象必须是相同类型的容器,且必须保存相同类型的元素。而且只有当元素类型定义了相应的比较运算符才可以比较,比较方式和string类似。

10.除array外,所有标准库容器都提供灵活的内存管理。

11.当我们用一个对象来初始化容器时,或将一个对象插入到容器中时,实际上放入到容器中的是对象值得一个拷贝。

12.在新标准下,接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器,如果范围为空,不插入任何元素,insert操作会将第一个参数返回。

std::list<int> ls;
int i;
auto iter = ls.begin();
while (std::cin >> i)
iter = ls.insert(iter, i); // 等价于调用push_front

13.emplace函数在容器中直接构造元素,传递给emplace函数的参数必须与元素类型的构造函数相匹配。

14.在顺序容器中访问元素的操作如下,而且下面操作返回的都是引用,如果容器是const的对象,则返回值是const引用。

15.顺序容器的删除操作。

16.在一个forward_list中添加或删除元素的操作是通过改变给定元素之后的元素来完成的,所以forward_list没有insert,emplace和erase,而是定义了一些其他操作。

17.除了array外,可以用resize来增大或缩小容器。如果当前大小大于所要求大小,则多余的会被删除,反之会增加新元素到尾部。

18.向容器中添加或删除元素可能会使指向容器元素的指针,引用或迭代器失效。

向容器添加元素之后 :

  • 如果容器是string或vector,且存储空间被重新分配,则都会失效,如果未重新分配,则指向插入位置之前的仍然有效,插入位置之后的会失效。
  • 对于deque,插入到除首尾位置之外的任何位置都会失效,如果在首尾位置添加元素,迭代器会失效,但指向存在元素的指针和引用不会失效。
  • 对于list和forward_list,仍然有效。

从容器中删除元素后:

  • 对于vector和string,指向被删除元素之前的仍然有效。注意:尾后迭代器总是会失效。
  • 对于deque,如果在首尾位置之外的任何位置删除元素,指向被删除元素外其他元素的会失效,如果删除的是尾元素,则尾后迭代器会失效,但其他的不受影响。如果删除首元素,也不会受影响
  • 对于list和forward_list,仍然有效。

19.范围for语句体内不应该改变其所遍历序列的大小,因为一旦添加或删除元素,用来判断结束的end()函数的值可能变得无效了。

20.vector元素的存储是连续的,当增加元素的时候如果连续的内存空间不够,则会重新分配空间。string和vector通常会预留空间作为预备。定义vector对象的时候设定其大小也就没什么必要了,事实上如果这么做性能可能更差。只有一种例外情况,就是所有元素的值都一样。

21.管理容量的成员函数。

reserve至少会分配指定大小的空间,但是可能更大,而且当参数小于当前容量的时候,reserve什么也不做。

shrink_to_fit只是一个请求,标准库并不保证退还内存。

只有在insert操作时size()和capacity()相等或调用reserve时才会重新分配内存,会分配多少取决于实现。

22.修改string的操作。

23.string的搜索操作。

C++ Primer 笔记——顺序容器的更多相关文章

  1. c++ primer 9 顺序容器

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

  2. C++ Primer 笔记——关联容器

    1.关联容器支持高效的关键字查找和访问,标准库提供8个关联容器. 2.如果一个类型定义了“行为正常”的 < 运算符,则它可以用作关键字类型. 3.为了使用自己定义的类型,在定义multiset时 ...

  3. C++ 顺序容器

    <C++ Primer 4th>读书笔记 顺序容器内的元素按其位置存储和访问.容器类共享公共的接口,每种容器类型提供一组不同的时间和功能折衷方案.通常不需要修改代码,只需改变类型声明,用一 ...

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

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

  5. 《C++ Primer》笔记 第9章 顺序容器

    顺序容器类型 类型 解释 vector 可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 deque 双端队列.支持快速随机访问.在头尾位置插入.删除速度很快 list 双向链表 ...

  6. 【c++ Prime 学习笔记】第9章 顺序容器

    一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...

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

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

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

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

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

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

随机推荐

  1. 20165234 《Java程序设计》第九周学习总结

    第九周学习总结 教材内容学习 第十三章 Java 网络编程 URL 类 URL 类是 java.net 包中的一个重要的类,使用URL创建对象的应用程序称为客户端程序. 一个 URL 对象通常包含最基 ...

  2. PL/SQL 加字段 修改数据库之后 之后记得保存脚本

  3. Python 面向对象【1】

    对象 = 属性 + 方法   面向对象特征:分装 继承 多态[不同对象对同一方法响应不同行动]   类定义 class xxx: .... ....   类对象 类对象支持两种操作:属性引用和实例化 ...

  4. ajax跨域请求 Uncaught SyntaxError: Unexpected token :

    最近使用前后端分离开发项目比较多,经常碰到的一个问题就是,前端静态页面请求,后端api获取数据,很多时候,前端和后端都不是在同一个域下的(协议,域名,端口). 这里使用的是ajax请求,因为浏览器的同 ...

  5. mongoDB Liunx下安装及配置

    以下以ubuntu 16.04(64位)操作系统为例: 一.下载和安装 在ubuntu下安装mongodb可以使用 apt-get进行安装,也可以直接下载编译好的二进制文件进行安装.下面主要介绍使用二 ...

  6. shell文本左右对齐排版【转】

    文本左右对齐排版 有文本4.txt如下: 111111111111111111111 98912 张三 222222222222222222 150020 李四四 333333333333333333 ...

  7. vc++基础班[26]---进程的相关操作

      ①.ShellExecute 进行进程的创建,属于 shell api: //int iRet = (int)ShellExecute(m_hWnd, _T("open"), ...

  8. SQL SERVER 常见SQL和函数使用

    一.语法 参考原文:https://blog.csdn.net/xushaozhang/article/details/55053037 1.查询插入 (1)SELECT INTO 语句格式: Ora ...

  9. 【转】thread.sleep(0)与thread.sleep(1)的区别

    Thread.Sleep(0) Sleep的意思是告诉操作系统自己要休息n毫秒,这段时间就让给一个就绪的线程吧.当n=0时,意思是要放弃自己剩下的时间片,但是仍然是就绪状态.Sleep(0)只允许那些 ...

  10. Java文件复制

    主要是工作代码,无解释. /** * 将文件或文件夹source复制到dest * <br>目标文件检测: * <br> a.当文件不存在时:需要创建文件 * <br&g ...