1.标准库中定义了一些顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。
2.如果容器的元素类型没有默认构造函数,那么在构造这个容器的时候不能只指定这个容器的数目,因为没有办法默认构造这些元素。
3.常见的一些容器操作
4.当一个容器初始化另一个容器拷贝时,两个容器的元素类型必须完全匹配,如果用一个容器的迭代器去初始化另一个容器时,只要元素类型可以转换即可。
5.当定义一个array时除了指定类型之外还要定义它的大小,array可以进行拷贝赋值。
std::array<int, 3> arr = {1, 2, 3}; std::array<int, 3>::iterator iter; std::array<int, 3> 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的搜索操作。