C++中的容器
来源:互联网 发布:程序员如何保护颈椎 编辑:程序博客网 时间:2024/04/27 13:35
C++中常用的容器有:顺序性容器(vator,deque,list),关联容器(map,set),容器适配器(queue,stack)
1.顺序性容器
1.1 vector
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于有连续的存储空间,所以在插入和删除的操作方面效率比较慢。
vector的另一个常见的问题是clear操作。clear只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越大,导致内存泄露,现在经常用的方法是swap函数来进行解决:
利用swap函数,和临时对象交换,使V对象的内存为临时对象内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。
vetor<int>().swap(V); 或者 V.swap(vector<int>());
1.2 deque
连续的存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于提供了两级数组结构,第一级完全类似于vector,代表实际容器;另一级维护容器的首位地址。这样,deque除了具有vector的所有功能外,还支持高效的首端插入和删除操作。
vector只能在末端插入数据,而deque支持双端插入数据。
1.3 list
非连续存储结构,具有双链表结构,每个元素维护一对前向和后向的指针,因此支持前向和后向遍历。支持高效的随机插入和删除操作。但随机访问效率低下,由于需要额外维护指针,所以开销也比较大。
2. 关联容器
2.1 map
map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能。所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。
在构造map时是按照一定的顺序进行的。map的插入和删除的效率比其他序列的容器高,因为对关联容器来说,不需要进行内存的拷贝和移动,只是指针的移动。由于map的每个数据对用红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的。一个父节点指针,左右孩子指针,还有一个枚举值(表示红黑色),所以map的其中的一个缺点就是比较占用内存空间。
2.2 set
set的底层使用红黑树实现,插入删除时仅仅移动指针即可。set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧值,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。
3.容器适配器
3.1 queue
queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque再删除元素的时候释放空间,同时重新申请空间的时候无需拷贝所有元素。
3.2 stack
stack是实现先进后出的功能。和queue一样也是内部封装了deque。
1.顺序性容器
1.1 vector
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于有连续的存储空间,所以在插入和删除的操作方面效率比较慢。
vector的另一个常见的问题是clear操作。clear只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越大,导致内存泄露,现在经常用的方法是swap函数来进行解决:
利用swap函数,和临时对象交换,使V对象的内存为临时对象内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。
vetor<int>().swap(V); 或者 V.swap(vector<int>());
1.2 deque
连续的存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于提供了两级数组结构,第一级完全类似于vector,代表实际容器;另一级维护容器的首位地址。这样,deque除了具有vector的所有功能外,还支持高效的首端插入和删除操作。
vector只能在末端插入数据,而deque支持双端插入数据。
1.3 list
非连续存储结构,具有双链表结构,每个元素维护一对前向和后向的指针,因此支持前向和后向遍历。支持高效的随机插入和删除操作。但随机访问效率低下,由于需要额外维护指针,所以开销也比较大。
2. 关联容器
2.1 map
map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能。所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。
在构造map时是按照一定的顺序进行的。map的插入和删除的效率比其他序列的容器高,因为对关联容器来说,不需要进行内存的拷贝和移动,只是指针的移动。由于map的每个数据对用红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的。一个父节点指针,左右孩子指针,还有一个枚举值(表示红黑色),所以map的其中的一个缺点就是比较占用内存空间。
2.2 set
set的底层使用红黑树实现,插入删除时仅仅移动指针即可。set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧值,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。
3.容器适配器
3.1 queue
queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque再删除元素的时候释放空间,同时重新申请空间的时候无需拷贝所有元素。
3.2 stack
stack是实现先进后出的功能。和queue一样也是内部封装了deque。
0 0
- C++STL中的容器
- C++STL中的set容器和map容器
- Object - C 语言中的数据存储容器
- C模板实现STL容器中的vector
- C++--容器
- C++中的标准模板库STL及容器
- 【温故而知新】C和C++6:STL中的vector容器
- 【温故而知新】C和C++7:STL中的deque容器
- 【温故而知新】C和C++8:STL中的list容器
- 【温故而知新】C和C++9:STL中的set容器
- 标准C++STL中的容器类简单介绍
- c++primer关联容器中的“单词转换map程序”分析
- 【学习C++】标准C++中的STL容器类简介
- 【C/C++】STL容器
- c++中的容器在vc中和在c++builder中的不同
- C#中的容器
- Java中的容器
- C++中的容器类
- ServiceLoader服务提供者模式,实现动态插件加载,类责任链模式
- Sallen-Key 有源滤波器-ONE
- 第十五周项目 2 阅读程序(1)
- Azkaban配置定时启动程序
- 王小川:智能硬件走入“互联网化”误区
- C++中的容器
- iphone6 Images.xcassets
- 第15周项目3-(2)
- 4G时代,Wi-Fi还有未来吗?
- 表单基础3
- effective C++ 读书笔记 条款36-37
- 【android】利用getViewTreeObserver().addOnGlobalLayoutListener()获得一个视图的高度
- alsa与PulseAudio
- cloudera的各种默认数据库 hive mysql