码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer 笔记——容器

时间:2017-07-30 14:45:49      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:fit   images   保存   swap   blog   name   auto   返回   ++   

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的搜索操作。

技术分享

技术分享

 

C++ Primer 笔记——容器

标签:fit   images   保存   swap   blog   name   auto   返回   ++   

原文地址:http://www.cnblogs.com/zoneofmine/p/7225314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!