本文转载自简书,仅供个人收藏,原文链接在此。
这三个是C++中比较常用的顺序容器,如何选择这三个是一个值得探讨的问题。
三种容器各自的特点:
std::array
:元素占用的空间是在栈上分配的,大小固定不变,,内存连续,可随机存取。是对静态数组的封装。封装后占用的内存与封装前是一样的。std::vector
:元素占用的空间是在堆上分配的,大小是可以改变的,每当容器需要扩大时,都会按照相同的系数进行扩大,内存连续,可随机存取。是对动态数组的封装。封装后占用的内存比封装前要大,一般是多两个指针的大小。std::list
:元素占用的空间是在堆上分配的,空间是按需分配的,用到一个元素的空间,就分配一个元素的空间。不能随机存取,可双向存取。list的每个元素中都要包含一个指向下个元素的指针。
选择:
- 如果你的元素个数确定且数量不是很大,应使用
std::array
,在存取速度和内存占用上,相对静态数组是没有消耗的,且类型安全。 - 如果你的元素个数不确定,但是元素个数的变化频率比较低,这时候应选择使用
std::vector
。存取速度上相对与动态数组是没有消耗的。但是(1)一般默认会多两个指针的内存大小,原因是记录当前std::vector
的大小之类的状态(2)当元素个数达到std::vector
的最大容量时,std::vector
会重新分配新的足够的空间来储存数据,并将旧的数据拷贝到新分配的空间中,这两点会带来一定的消耗。 - 如果你的元素个数不确定,并且元素的个数变化的频率比较高,这时候选择使用
std::list
。 - 由于
std::list
不是随机存取的,所以不能使用stl中的std::sort
函数。这时候要考虑另外两种容器或者自己写sort
函数了。