C++ Primer 笔记——顺序容器
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 笔记——顺序容器的更多相关文章
- c++ primer 9 顺序容器
		定义: #include <vector> #include <list> #include <deque> vector<int> svec; lis ... 
- C++ Primer 笔记——关联容器
		1.关联容器支持高效的关键字查找和访问,标准库提供8个关联容器. 2.如果一个类型定义了“行为正常”的 < 运算符,则它可以用作关键字类型. 3.为了使用自己定义的类型,在定义multiset时 ... 
- C++ 顺序容器
		<C++ Primer 4th>读书笔记 顺序容器内的元素按其位置存储和访问.容器类共享公共的接口,每种容器类型提供一组不同的时间和功能折衷方案.通常不需要修改代码,只需改变类型声明,用一 ... 
- C++ Primer 读书笔记: 第9章 顺序容器
		第9章 顺序容器 引: 顺序容器: vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器: stack 后进先出栈 queue 先进先出队列 priori ... 
- 《C++ Primer》笔记 第9章 顺序容器
		顺序容器类型 类型 解释 vector 可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 deque 双端队列.支持快速随机访问.在头尾位置插入.删除速度很快 list 双向链表 ... 
- 【c++ Prime 学习笔记】第9章 顺序容器
		一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ... 
- 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 ... 
随机推荐
- Java开发环境配置(2)--jdk配置和 多个JDK问题处理
			==2018-8-15 16:41:06 更新 服务器 jdk1.6升级为1.8,没有卸载原来的1.6,直接安装1.8. 更改环境变量的 JAVA_HOME所指路径后, cmd 输入 java -ve ... 
- JavaScript编程基础2
			1,数据类型相关操作 使用typeof x函数查看变量的数据类型: typeof "John" // 返回 string typeof 3.14 // 返回 number type ... 
- TensorFlow走过的坑之---数据读取和tf中batch的使用方法
			首先介绍数据读取问题,现在TensorFlow官方推荐的数据读取方法是使用tf.data.Dataset,具体的细节不在这里赘述,看官方文档更清楚,这里主要记录一下官方文档没有提到的坑,以示" ... 
- tomat startup.bat 日志乱码问题解决
			1.修改conf 下的logging.properties java.util.logging.ConsoleHandle.encoding=GBK C:\Users\Administrator> ... 
- Thymeleaf模板布局
			⒈定义片段 1.使用th:fragment <div th:fragment="copy"> © 2019 <a href="http://www.co ... 
- MySQL:Your password has expired. To log in you must change it using a client that supports expired passwords
			MySQL:V5.6.37 安装后发现没远程权限,为了方便,就直接把hostname@root修改为%@root,密码修改为和localhost@root一样 然后尴尬的事情发生了,本地登陆正常,远程 ... 
- Python运维开发基础08-文件基础【转】
			一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ... 
- 利用binlogserver恢复单表实验【转】
			使用场景 每次开启binlogserver 指定了mysql-bin.0000XX 后都会从该点从头进行传输一次 创建binlogserver [root@mysql-zst3 binlogserve ... 
- 用vue+element-ui开发后台笔记
			1.前端通过 formData: new FormData(), 构造对象传数值给后台! 当传给后台的参数中有图片的时候,需要把需要传输的数据通过构造对象new FormData()的形式存数据,并且 ... 
- 正则表达式处理BT的html嵌套问题
			在博问里面求教大神,把问题搞定.在此做个记录备份,也给碰到类似问题的园友提供解决思路. 简化的业务场景就是,在页面html标签中的属性中嵌套了html标签,怎么用用正则表达式过滤闭合的html标签(& ... 
