STL容器

Posted 野渡书生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL容器相关的知识,希望对你有一定的参考价值。

1、分类

我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。

2、Verctor

优点:

典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在序列的头部插入、删除的时间复杂度是O(n),可以在任何位置插入新元素,有随机访问功能,能非常方便地进行随机存取,即 [] 操作符,而且两个类型相同的vector变量可以直接做相等操作。

缺点:

a、初始化复杂:初始化方式vector<int> a(num) ,生成连续的num个0;vector<int> a(num,10),生成num个10;利用pushback()函数;初始化方式较为复杂,不能像数组一样int a[10]={…},进行批量初始化操作;

b、删除复杂:它维护一段连续的内存空间,具有固定的起始地址,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。

c、不适用于大对象处理:当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。

d、释放空间复杂:vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。vector为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了未清内存,因为vector的capacity容量未变化,系统维护一个的默认值。要内存回收需要更复杂的操作(swap技法就是通过交换函数swap(),使得vector离开其自身的作用域,从而强制释放vector所占的内存空间)

3、List

优点:

list类似于C语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,任意元素的访问、修改时间复杂度是O(n),插入、删除操作是常数时间复杂度,可以在任何位置插入新元素。

缺点:

因而它没有提供 [] 操作符重载。

4、Deque

deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列,内存是连续的,可以动态缩小空间。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。

它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。或者我们可以这么认为,deque是vector跟list的折中。

5、Map

map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,查找的时间复杂度O(logN),这种特性了使得map类似于数据结构里的红黑二叉树。

6、Multimap

和map一样,区别是键可以重复。multimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。

7、Set

set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。关联容器,元素不允许有重复,数据被组织成一棵红黑树,查找的速度非常快,时间复杂度是O(logN)

8、Multiset

multiset类似于数学里面的集合,集合中可以包含重复的元素。关联容器,和set一样,却别是允许有重复的元素,具备时间复杂度O(logN)查找功能。

9、容器优缺点:

用哪种容器的选择看起来非常繁琐,头脑中如果有个每个容器大概的模型,在选择的时候会更为轻松点。

(1)Vector的数据模型就是数组

优点:

内存和C完全兼容、高效随机访问、节省空间

缺点:

内部插入删除元素代价巨大、动态大小查过自身容量需要申请大量内存做大量拷贝。

(2) List的数据结构模型是链表

优点:

任意位置插入删除元素常量时间复杂度、两个容器融合是常量时间复杂度

缺点:

不支持随机访问、比vector占用更多的存储空间

(3)Deque的数据模型是数组和链表的折衷

优点:

高效随机访问、内部插入删除元素效率方便、两端push pop

缺点:

内存占用比较高

(4) Map、set、multimap、multiset的数据结构模型是二叉树(红黑树)

优点:

元素会按照键值排序、查找是对数时间复杂度、通过键值查元素、map提供了下标访问

10、使用原则

1)如果需要随机访问,用vector;

2)如果存储元素的数目已知,用vector;

3)需要任意位置随机插入删除,用list;

4)只有需要更多在容器的首部尾部插入删除元素,用deque;

5)元素是复杂结构用list,也可以用vector存储指针(需要额外的精力去维护内存),看需求;

6)如果操作是基于键值,用set map;

7)如果需要经常的搜索,用map set;

8) map set的区别是map中的元素都是pair<key, value>,同时map提供下标访问。

以上是关于STL容器的主要内容,如果未能解决你的问题,请参考以下文章

STL容器

STL 序列容器

STL中的容器

ACM常用STL容器

STL容器简介

STL容器共性机制和使用场景