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
原则:只有当迫不得已时才可以分配新的内存空间。