名称 | 特点 | 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都很方便
|