一、各个顺序容器性能差异主要体现在一下两个方面:
1.在容器中任意位置添加和删除元素的代价
2.随机访问容器中元素的代价
vector、list、deque、forward_list、array、string
vector是可变大小数组,支持快速随机访问,在尾部插入和删除元素较为方便
list是双向链表,只支持双向顺序访问,在任意位置插入和删除元素都比较方便
deque是双端队列,支持快速随机访问,在头尾位置插入和删除元素较为方便
forward_list是单向链表,只支持单向顺序访问。在任意位置插入和删除元素都比较方便
array是固定大小的数组,支持快速随机访问。不能添加和删除元素
string是专门用于保存char的vector,支持快速随机访问,在尾部插入和删除元素较为方便
对于vector和string由于是在内存中连续存储,所以可以根据下标来计算地址进行访问,在中间删去和添加某一元素,其后面位置都要进行移动以保持连续存储。
list、forward_list主要用于解决在容器任意位置插入和删除元素代价大的问题,但其后果是访问任一元素较为麻烦,需要对整个容器进行遍历后才可以,并且其额外内存开销较大。
deque是一种较为复杂的数据结构,在中间位置添加和删除元素代价较高,但在两端添加和删除元素较为方便,速度与list和forward_list较为接近。
二、关于容器的选用基本原则:
1.除非有很好的理由选用其他容器,否则使用vector
2.容器元素很多,且对空间开销比较敏感,则不要使用list和forward_list
3.如果要求随机访问,则使用vector或string,如果要求在中间位置插入和删除方便,则使用list和forward_list
4.只在头尾位置插入和删除元素,使用deque
5.如果既要求能随机访问容器中元素,又要求可以在任意位置添加和删除元素,那就要看在工程中占主导地位的是随机访问还是任意位置插入、删除(看二者哪个操作需要的更更加频繁),视情况选择vector或者list
三、容器操作层次
几乎可以在容器中保存所有类型的数据
如果出现此种情况,nodefault为无构造函数类型
vector<nodefault> a(10, init);//正确
vector<nodefault> b(10);//错误
1、对所有容器都通用的操作
iterator 迭代器
const_iterator 只读迭代器
size_type 无符号整数类型 //足够存放任何容器对象的大小 例如:string::type
difference_type 带符号整数类型
value_type 元素类型
reference 元素左值类型 //元素类型的一个引用
const_referemce 元素const左值类型
2、仅仅适用于顺序容器、适用于关联容器、适用于无序容器
3、只适用于一小部分容器
四、容器定义与初始化
1、C c;
C c1(c2);
C c {};
C c (a,b);//ab均为迭代器
C c(n,t);
C c(n);
#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
int main()
{
list<string> a{ "aaa", "bbb", "ccc" };
list<string>::iterator it = a.begin();
it++;
it++;
list<string> b(a.begin(), it);
for (list<string>::iterator it1 = b.begin(); it1 != b.end(); it1++)
{