容器就是特定类型对象的集合。因为可以容纳某相同类型的许多实体,所以叫它容器。
容器主要分为顺序容器,关联容器(又分为有序关联和无序关联容器)。本文主要是写顺序容器。
顺序容器有以下几种类型:
vector: 向量,相当于可变大小的数组。随机访问快,在尾部之外的位置插入或删除元素可能很慢
deque:双端队列。随机访问快,在头尾部插入删除快。
list: 双向链表。在list中任何位置增加和删除都很快。
forward_list: 单向链表。
array: 固定大小的数组。
string: 与vector相似,但是专门保存字符的。
注意:
string和vector将元素保存在连续内存中(栈中),由于元素是连续存储的,所以通过元素下标来计算其地址是非 常快速的。但在中间位置添加删除会分厂耗时,可能会移动很多元素。
使用vector的时候,通常使用push_back( )函数。向量操作中有一个性能问题,如果频繁扩展容量,会影响到效率。因为扩容意味着分配更大的空间,复制原空间到现空间,删除原空间等操作。但是向量并不是每次扩展都要扩容。当初始化一个向量时,它会预留一部分空间(可用capacity( )查看)。当所需空间超过了预留的空间才会进行扩容。为了提高程序效率,可以根据可能的元素数量来初始化向量。如下例:
vector<string> abc;
abc.reserve(1000);//为abc预留1000个元素空间
list和forward_list不支持随机访问,只能遍历。这两个元素的额外内存开销也很大。
forward_list和array是新C++ 11新增的容器。forward_list的设计目标是达到与手写链表一样的性能,因此其没有size操作(因为保存或计算其大小会增加额外开销)。
通常我们使用迭代器来遍历容器中的元素。如下面例子:
vector <int> a(10, 1);
for(vector<int>::iterator it = a.begin();it != a.end(); it++)//注意:a.end()指向最后一个元素的下一个元素
cout<<*it<<endl;