一:list
#include <list>
list 是一个双向链表,可以高效的进行插入和删除操作;但是由于是链表,所以进行固定某一位置的访问时效率会比较低。
而且由于它的空间是不连续的,所以不支持用下标去随机访问。(特点和vector正好相反)
二:vector
#include <vector>
vector是一个动态数组,由于是数组,所以他的插入和删除操作都会导致其他数据的位置移动,所以插入和删除没有list高效。
但是他对固定位置的数据访问就比list高效很多。他比list多了vector::at()函数,可以让用户直接去访问某个位置的指,也支持直接像c语言一样用数组下标去访问。
关于list和vector的选择,如果是有对某个位置有固定访问的场景,比如房间号、电梯楼层,可以选择用vector;其他用不到固定位置访问的,可以用list,比如数据的缓存,需要快速的插入和取出。
函数 |
表述 |
c.assign(beg,end) c.assign(n,elem) |
将[beg; end)区间中的数据赋值给c。 将n个elem的拷贝赋值给c。 |
c.at(idx) |
传回索引idx所指的数据,如果idx越界,抛出out_of_range。 |
c.back() |
传回最后一个数据,不检查这个数据是否存在。 |
c.begin() |
传回迭代器重的可一个数据。 |
c.capacity() |
返回容器中数据个数。 |
c.clear() |
移除容器中所有数据。 |
c.empty() |
判断容器是否为空。 |
c.end() |
指向迭代器中的最后一个数据地址。 |
c.erase(pos) c.erase(beg,end) |
删除pos位置的数据,传回下一个数据的位置。 删除[beg,end)区间的数据,传回下一个数据的位置。 |
c.front() |
传回第一个数据。 |
get_allocator |
使用构造函数返回一个拷贝。 |
c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) |
在pos位置插入一个elem拷贝,传回新数据位置。 在pos位置插入n个elem数据。无返回值。 在pos位置插入在[beg,end)区间的数据。无返回值。 |
c.max_size() |
返回容器中最大数据的数量。 |
c.pop_back() |
删除最后一个数据。 |
c.push_back(elem) |
在尾部加入一个数 |