顺序容器类型:
容器均定义为模板类,顺序容器几乎可以保存任意类型的元素,我们可以定义一个容器,其元素的类型是另一个容器
- vector:可变大小数组。支持快速随机访问。在尾部之外的位置插入成删除元素可能很慢
- deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快
- list:双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快
- forward_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快
- array:固定大小数组。支持快速随机访问。不能添加或删除元素
- string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快
除了固定大小的array外,其他容器都提供高效、灵活的内存管理,下面以vector为例介绍一下相关的用法,有写成员函数可能并不通用,例如forward_list就没有size操作,这里就不一一点出来了。
定义和初始化:
| vector<int> a | 默认构造函数 |
| vector<int> a(b) | a初始化为b的拷贝 |
| vector<int> a=b | |
| vector<int> a={1,2,3,4,..} | a初始化为初始化列表中元素的拷贝 |
| vector<int> a{1,2,3,4,..} | |
| vector<int>a(b,c) | a初始化为迭代器b和c指定范围中的元素的拷贝 |
| vector<int>a(n) | a包含n个元素,这些元素进行了值初始化 |
| vector<int>a(n,t) | a包含n个初始化为值t的元素 |
赋值:
| a=b | 将a中的元素替换为b中元素的拷贝 |
| a={1,2,3,...} | 将a中元素替换为初始化列表中元素的拷贝 |
| swap(a,b) | 交换a和b中的元素,swap通常比从b向a拷贝元素快得多 |
| a.swap(b) | |
| a.assign(b,d) | 将a中的元素替换为迭代器b和d所表示的范围中的元素。 迭代器b和d不能指向a中的元素 |
| a.assign({1,2,...}) | 将a中的元素替换为初始化列表中的元素 |
| a.assign(n,t) | 将a中的元素替换为n个值为t的元素 |
添加元素:
| a.push_back(t) | 在a的尾部创建一个值为t或由args创建的元素 返回void |
| a.emplace_back(args) | |
| a.push_front(t) | 在a的头部创建一个值为t或由args创建的元素 返回void |
| a.emplace_front(args) | |
| a.insert(p,t) | 在迭代器p指向的元素之前创建一个值为t或由args创建的元素。返回指向新添加的元素的迭代器 |
| a.emplace(p,args) | |
| a.insert(p,n,t) | 在迭代器p指向的元素之前插入n个值为t的元素。返回指向新添加的第一个元素的迭代器,若n为0,则返回p |
| a,insert(p,b,e) | 将迭代器b和e指定的范围内的元素插入到迭代器p指向的元素之前。b和e不能指向a中的元素。返回指向新添加的第一个元素的迭代器。若范围为空,则返回p |
| c,insert(p,{1,2,3,...}) | 将元素值列表插入到迭代器p指向的元素之前。返回指向新添加的第一个元素的迭代器。若列表为空,则返回p |
使用emplace_front,emplace,emplace_back时,将参数(args)传递给元素类型的构造函数。如下面代码:
class Book
{int a;int b;int c;book(int x,int y,int z):a(x),b(y),z(c){}
};vector<Book> book;
book.emplace_back(1,2,3);
访问元素:
| a.back() | 返回a中尾元素的引用 |
| a.front() | 返回a中首元素的引用 |
| a[n] | 返回a中下标为n的元素的引用,n是一个无符号整数 若n>=a.size(),则函数行为未定义 |
| a.at(n) | 返回a中下标为n的元素的引用。如果下标越界,则抛出一个out_of_range异常 |
删除元素:
| a.pop_back() | 删除a中尾元素 |
| a.pop_front() | 删除a中首元素 |
| a.erase(p) | 删除迭代器p所指定的元素,返回一个执行被删除元素之后元素的迭代器,若p指向尾元素,则返回尾后迭代器。若p是尾后迭代器,则函数行为未定义 |
| a.erase(b,e) | 删除迭代器b和e所指定范围内的元素。返回一个指向最后一个被删除元素之后的元素的迭代器,若e本身就是尾后迭代器,则也返回尾后迭代器 |
| a.clear() | 删除a中所有的元素 |
操作容器空间:
| a.resize(n) | 调整a的大小为n个元素,若n<a.size(),则多出的元素被丢掉。若需要添加新元素,则对新元素进行值初始化 |
| a.resize(n,t) | 调整a的大小为n个元素,若需要添加新元素,则对新元素初始化为t |
| a.reserve(n) | 分配至少能容纳n个元素的内存空间 |
| a.capacity() | 不重新分配内存空间的话,a最大可以保存多少元素 |
| a.shrink_to_fit() | 将capacity()减少为于size()相同大小 |