1.顺序容器

与内置数组相比,array是一种更安全、更容易使用的数组类型。

forward_list的设计目标是达到与最好的手写的单向链表数据结构相当的性能。因此,forward_list没有size操作。对其他容器而言,size保证是一个快速的常量时间的操作。

顺序容器 性能
vector 可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢
deque 双端队列,支持快速随机访问,在头尾位置插入/删除元素速度很快
list 双向链表,支持双向顺序访问,在list中任何位置进行插入/删除元素速度很快
forward_list 单向链表,只支持单向顺序访问,在链表任何位置进行插入/删除速度很快
array 固定大小数组,支持快速随机访问,不能添加或删除元素
string 与vector相似,随机访问快,在尾部插入/删除快

2.容器库概览

2.1迭代器

迭代器是一个变量,可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

一般来说我们无须知道迭代器的精确类型,实际上,使用iterator和const_iterator来表示迭代器的类型。const_iterator和常量指针差不多,能读取但不能修改它所指的元素值。

解引用迭代器可以获得迭代器所指的对象。

4.vector对象是如何增长的

为了支持快速随机访问,vector将元素连续存储。

减少容器空间重新分配次数的策略:

vector和string的实现通常会分配比新的空间需求更大的内存空间。容器预留这些空间作为备用,可用来保存更多的新元素。这样,就不需要每次添加新元素都重新分配容器的内存空间了。

管理容量的成员函数:

c.shrink_to_fit():请将capacity()减少为与size()相同大小,可以调用shrink_to_fit来要求容器退回不需要的内存空间。

c.capacity():不重新分配内存空间的话,c可以保存多少个元素

c.reserve(n):分配至少能容纳n个元素的内存空间。reserve并不改变容器中元素的数量,它仅影响vector预先分配多大的内存空间。

c.resize():只改变容器中元素的数目,而不是容器的容量。

vector<int> nums;
cout << "nums:size = " << nums.size() << "  nums:capacity = " << nums.capacity() << endl;
//输出:nums:size = 0  nums:capacity = 0
for(int i = 0; i < 24; ++ i) nums.push_back(i);
cout << "nums:size = " << nums.size() << "  nums:capacity = " << nums.capacity() << endl;
//输出:nums:size = 24  nums:capacity = 32 
nums.reserve(50); //将capacity设定为至少50,可能会更大
cout << "nums:size = " << nums.size() << "  nums:capacity = " << nums.capacity() << endl;
//输出:nums:size = 24  nums:capacity = 50
nums.shrink_to_fit();//要求归还内存
cout << "nums:size = " << nums.size() << "  nums:capacity = " << nums.capacity() << endl;
//输出:nums:size = 24  nums:capacity = 24 

原则:只有当迫不得已时才可以分配新的内存空间。

posted on 2020-03-02 01:02  xiaobaizzZ  阅读(131)  评论(0编辑  收藏  举报