名称 | 特点 |
vector | 可变大小数组。支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢 |
deque | 双端队列。支持快速随机访问。在头尾插入、删除速度很快 |
list | 双向链表。只支持双向顺序访问。在list中任何位置进行插入、删除操作都很快 |
forward _list | 单向链表。只支持单向顺序访问。在链表任何位置进行插入、删除操作速度都很快 |
array | 固定大小数组。支持快速随机访问。不能添加或删除元素 |
string | 与vector相似的容器,但专门用户保存字符。随机访问快。在尾部插入、删除速度快 |
1.各顺序容器支持方法见下表(未打勾的为不支持)
方法 | vector | deque | list | forward_list | array | string | 解释 |
::append | √ | ||||||
::assign | √ | √ | √ | √ | |||
::at | √ | √ | √ | √ | 容器中的第几个元素 | ||
::back | √ | √ | √ | √ | √ | ||
::begin | √ | √ | √ | √ | √ | ||
::capacity | √ | √ | |||||
::cbegin | √ | √ | √ | √ | √ | ||
::cend | √ | √ | √ | √ | √ | ||
::clear | √ | √ | √ | √ | 清空容器 | ||
::compare | √ | ||||||
::copy | √ | ||||||
::crbegin | √ | √ | √ | √ | √ | ||
::crend | √ | √ | √ | √ | √ | ||
::c_str | √ | ||||||
::data | √ | √ | √ | ||||
::emplace | √ | √ | √ | ||||
::emplace_back | √ | √ | |||||
::emplace_front | √ | √ | |||||
::empty | √ | √ | √ | √ | √ | 判断容器是否为空,如果为空,返回0,否则返回非0 | |
::end | √ | √ | √ | √ | √ | ||
::erase | √ | √ | √ | √ | |||
::fill | √ | ||||||
::find | √ | ||||||
::find_first_not_of | √ | ||||||
::find_fisrt_of | √ | ||||||
::find_last_not_of | √ | ||||||
::find_last_of | √ | ||||||
::front | √ | √ | √ | √ | √ | ||
::get_allocator | √ | √ | √ | √ | |||
::insert | √ | √ | √ | √ | |||
::length | √ | ||||||
::max_size | √ | √ | √ | √ | √ | ||
::merge | √ | ||||||
::operator+= | √ | ||||||
::operator= | √ | √ | |||||
::operator[] | √ | √ | √ | √ | √ | ||
::pop_back | √ | √ | √ | √ | |||
::pop_front | √ | √ | |||||
::push_back | √ | √ | √ | ||||
::push_front | √ | √ | |||||
::rbegin | √ | √ | √ | √ | √ | ||
::rend | √ | √ | √ | √ | √ | ||
::remove | √ | ||||||
::remove_if | √ | ||||||
::replace | √ | ||||||
::reserve | √ | √ | √ | ||||
::resize | √ | √ | √ | √ | |||
::rfind | √ | ||||||
::shrink_to_fit | √ | √ | √ | ||||
::size | √ | √ | √ | √ | √ | 返回容器的大小 | |
::substr | √ | ||||||
::sort | √ | ||||||
::swap | √ | √ | √ | √ | √ | ||
::splice | √ | ||||||
::unique | √ |
2.如何选择容器?
1>除非你有很好的理由选择其他容器,否则应使用vector
2>如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list
3>如果程序要求随机访问元素,应使用vector或deque
4>如果程序要求在容器的中间插入或删除元素,应使用list或forward_list
5>如果程序需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除操作,则使用deque
6>如果程序只有在读取输入时才需要在容器中间位置插入元素,随后需要随机访问元素,则
6.1>首先,确定是否真的需要在容器中间位置添加元素。当处理输入数据时,通常可以很容易地在vector追加数据,然后再调用标准库的sort函数
6.2>如果必须再中间位置插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到一个vector中
7>如果你不确定应该使用哪种容器,那么可以在程序中只使用vector和list公共的操作:迭代器,不适用下标操作,避免随机访问。这样,在必要时选择使用vector和list都很方便