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. Spark架构与作业执行流程简介

    https://www.cnblogs.com/shenh062326/p/3658543.html

  2. Jedis(java操作redis数据库技术)

    Redis有什么命令,Jedis就有什么方法. 客户端无法连接时,需要考虑防火墙配置,比如6379端口是否开放,也可以直接关闭防火墙. Jedis连接池: import org.junit.Test; ...

  3. Django中的缓存基础知识

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  4. 【Linux】时间同步设置+防火墙设置+SELinux设置

    时间同步设置 在大数据集群环境中,要求每台集群的时间必须是同步的,这样我们就会要求每台集群的时间必须和一台服务的时间是同步的.接下来介绍一下步骤: 1,设置ntp客户端 yum -y install ...

  5. 【转】python f-string

    [转]python f-string   文章目录 1. 主要内容 1.1. 旧时代的格式化字符串 1.1.1. Option #1: %-formatting 1.1.2. 怎样使用 %-forma ...

  6. MySQL报错总结

    错误一: MySQL从cmd使用命令“mysql -u root -p”启动报错,显示“不能连接到端口xxx”(实际端口为3306),这里的问题实际是由于我没有设置mysql开机自启动,所以解决方案就 ...

  7. Wireshark技巧-过滤规则和显示规则【转】

    转自:https://www.cnblogs.com/icez/p/3973873.html Wireshark是一个强大的网络协议分析软件,最重要的它是免费软件. 过滤规则 只抓取符合条件的包,在W ...

  8. Flask组件

    组件踩坑记录 : 先注册组件在使用配置(...) flask-script Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shel ...

  9. Eleaticsearch源码分析(一)编译启动

    转自:https://lunatictwo.github.io/2017/12/21/Eleaticsearch%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90(%E4%B8% ...

  10. hash·余数hash和一致性hash

    网站的伸缩性架构中,分布式的设计是现在的基本应用. 在memcached的分布式架构中,key-value缓存的命中通常采用分布式的算法 一.余数Hash     简单的路由算法可以使用余数Hash: ...