在C++中,容器被定义为:在数据存储上,有一种对象类型,它可以持有其他对象或指向其他对象的指针,这种对象类型就叫做容器。简单理解,即容器就是保存其他对象的对象。而且,这种“对象”还有处理“其他对象”的方法。
容器是随着面向对象语言的诞生而提出的,它甚至被认为是早期面向对象语言的基础。现在几乎所有面向对象语言中都伴随着一个容器,C++中则是标准模版库(STL)。
STL 对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。
1 vector
常用接口:
//初始化
vector vec; //默认初始化,空
vector vec2(vec); //使用vec初始化vec2
vector vec3(3); //初始化3个值为0的元素
vector vec4(4, 1); //初始化4个值为1的元素
vector vec5(5, "null"); //初始化5个值为null的元素
//常用的操作方法
vec.push_back(3); //向末尾添加元素3
vec.begin();//返回指向初始位置的迭代器
vec.end(); //返回指向末尾下一位置的迭代器
vec.size(); //当前vector容器真实占用的大小
vec.capacity();//capacity是指能允许的最大元素数,即预分配的内存空间。
vec.empty(); //判断是否为空
cout << vec[0] << endl; //取得第一个元素 支持[]
vec.insert(vec.end(), 5, 3); //从末尾下一位置插入5个值为3的元素
vec.pop_back(); //删除末尾元素
vec.erase(vec.begin(), vec.end());//删除之间的元素,其他元素前移
cout << (vec == vec2) ? true : false; //判断是否相等==、!=、>=、<=...
vec.clear(); //清空元素
vector vs1(3);
vector vs2(5);
vs1.swap(vs2); //执行后,vs1中5个元素,而vs2则存3个元素
要点
2 list
常用接口:
//初始化
list lst1; //创建空list
list lst2(3); //创建含有三个元素的list
list lst3(3, 2); //创建含有三个元素的值为2的list
list lst4(lst2); //使用lst2初始化lst4
//常用的操作方法
lst1.assign(lst2.begin(), lst2.end()); //分配值
lst1.push_back(10); //添加值
lst1.pop_back(); //删除末尾值
lst1.begin(); //返回首值的迭代器
lst1.end(); //返回末尾位置下一位的迭代器
lst1.clear();//清空值
bool isEmpty1 = lst1.empty(); //判断为空
lst1.erase(lst1.begin(), lst1.end()); //删除元素
lst1.front(); //返回第一个元素的引用
lst1.back(); //返回最后一个元素的引用
lst1.insert(lst1.begin(), 3, 2); //从指定位置插入3个值为2的元素
lst1.remove(2); //相同的元素全部删除
lst1.reverse(); //反转
lst1.size(); //含有元素个数
lst1.sort(); //排序,需要自己写重载操作符<
lst1.unique(); //删除相邻重复元素
要点
3 deque
是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。
实际上,deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。
常用接口与vector和list相似
要点:
(1) 随机访问方便,即支持[ ] 操作符和vector.at() ,但性能没有vector 好;
(2) 可以在内部进行插入和删除操作,但性能不及list ;
(3) 可以在两端进行push 、pop ;
vector 是一段连续的内存块,而deque 是多个连续的内存块, list 是所有数据元素分开保存,可以是任何两个元素没有连续。
vector 的查询性能最好,并且在末端增加数据也很好,除非它重新申请内存段;适合高效地随机存储。若已经知道需要存储元素的数目, 则选择vector。
list 是一个链表,任何一个元素都可以是不连续的,但它都有两个指向上一元素和下一元素的指针。所以它对插入、删除元素性能是最好的,而查询性能非常差;适合 大量地插入和删除操作而不关心随机存取的需求。若需要随机插入/删除(不仅仅在两端),则选择list
deque 是介于两者之间,它兼顾了数组和链表的优点,它是分块的链表和多个数组的联合。 如果你需要随机存取又关心两端数据的插入和删除,那么deque 是最佳之选。