转载:http://blog.csdn.net/u013443618/article/details/49964299

这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)

STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。

1、顺序性容器

(1)vector
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23.....增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决:

复制代码代码如下:

vector<int> V;
V.push_back(1); 
V.push_back(2);
V.push_back(1); 
V.push_back(2);
vector<int>().swap(V); 
//或者 V.swap(vector<int>());

利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。

(2)deque
deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。

(3)list
list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

(4)在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
1) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2) 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

2、关联容器

(1)map
map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能,所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。

这是map的模板:
template < class Key, class T, class Compare= less<Key>, class Allocator=allocator< pair<const Key,T> > > class map;

从模板中我们可以看出,再构造map时,是按照一定的顺序进行的。map的插入和删除效率比其他序列的容器高,因为对关联容器来说,不需要做内存的拷贝和移动,只是指针的移动。由于map的每个数据对应红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的,一个父节点指针,左右孩子指针,还有一个枚举值(标示红黑色),所以map的其中的一个缺点就是比较占用内存空间。

(2)set
set也是一种关联性容器,它同map一样,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝,所以效率比较高。set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。

set模板原型:
template <class Key, class Compare=class<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) > class set;

set支持集合的交(set_intersection)、差(set_difference)、并(set_union)及对称差(set_symmetric_difference) 等一些集合上的操作。

3、容器适配器

(1)queue
queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque在删除元素的时候释放空间,同时在重新申请空间的时候无需拷贝所有元素。

其模板为:
template < TYPENAME _Sequence="deque<_TP" typeneam _Tp,> > class queue;

(2)stack
stack是实现先进后出的功能,和queue一样,也是内部封装了deque,这也是为啥称为容器适配器的原因吧(纯属猜测)。自己不直接维护被控序列的模板类,而是它存储的容器对象来为它实现所有的功能。stack的源代码原理和实现方式均跟queue相同。

转载于:https://www.cnblogs.com/panlangen/p/8075766.html

深入解析C++ STL中的常用容器相关推荐

  1. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  2. 开发中Docker常用容器记录

    开发中Docker常用容器记录 概览 分享工作学习中常用的Docker容器使用: 比如常用数据库的使用 消息队列类的使用 用于服务发现的容器使用 还有其他工作学习中使用到的 持续更新:https:// ...

  3. C++小课堂:STL中的栈容器(stack)

    栈很像我们的箱子,我们将衣服这些装进箱子,第一个拿出来的肯定是最顶上的那件衣服,栈也一样. 今天我们就来学习栈容器:stack 头文件:<stack> 之前介绍的vector其实是STL中 ...

  4. 【java笔记】java中的常用容器

    本文参考了知乎作者"Hello浩辰"的Java容器详解Ⅰ--概述和菜鸟教程的相关文章. 一.常用容器 java容器分为两大部分:Collection和Map.Collection是 ...

  5. 使用STL中的list容器实现单链表的操作

    #include<iostream> #include<list> #include<algorithm> using namespace std; void Pr ...

  6. 近万字带你了解“c++“STL中的各种容器

    目录 1.array容器 vector 和 array镶嵌使用 4.链表容器(list)是一个库封装好的一个双向链表 5.priority_queue: 优先队列 6.map和multimap 7.s ...

  7. 2015级C++第14周程序阅读 STL中的简单容器和迭代器

    阅读并运行程序,解释程序执行得到的结果 (1) #include<iostream> #include<vector> #include<iterator> usi ...

  8. C++走向远洋——60(十四周阅读程序、STL中的简单容器和迭代器)

    */* Copyright (c) 2016,烟台大学计算机与控制工程学院* All rights reserved.* 文件名:text.cpp* 作者:常轩* 微信公众号:Worldhello* ...

  9. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的 ...

最新文章

  1. RESTful风格及其SpringMVC实现
  2. 【Java Web前端开发】HTML表单和CSS部分
  3. STL中的set容器的一点总结
  4. 爱奇艺六季度付费用户数据一览,巨头A股还有希望吗?
  5. iPhone或让国内运营商划地为牢
  6. c语言现代方法16章 基础、课后习题、基础等
  7. Android基于Docker容器的双系统多开实现和自动化部署
  8. 深入理解javascript函数进阶系列第一篇——高阶函数
  9. spark on yarn webUI logs不能查看
  10. linux system函数传参,Linux系统调用例程system_call和参数传递
  11. Python os模块相关简介
  12. ssis sql_如何在SSIS中使用SQL随机数
  13. mqtt客户端工具_如何在 Rust 中使用 MQTT
  14. 验签传时间戳目的_不瞒你说:买来的海鸭蛋,一戳就流油,被中央台频频“曝光”,秘密终被解开...
  15. 全网首发:SHELL多个判断条件,不会短路
  16. JS导出Excel文件的方式
  17. 程序员应该掌握的英语词汇
  18. Python——文件读写
  19. 2021年煤矿瓦斯检查证考试及煤矿瓦斯检查模拟考试题
  20. Re:从零开始的DS生活 轻松从0基础实现多种队列

热门文章

  1. java窗体程序秒表,帮忙解释一个Java小程序(秒表)
  2. ERROR 1064 (42000): You have an error in your SQL syntax
  3. 关于vhr项目部署所遇到的问题总结,Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin
  4. 浅议“全局变量”、“多线程”和“编译器陷阱”
  5. 计算机网络知识大总结,包含各种熟悉得不能再熟悉的术语解析
  6. java垃圾收集方法_java几种垃圾收集方法和垃圾收集器
  7. 为什么我的crontab不起作用呢
  8. 给 QtCtreator 工程文件 pro 配置 pthread库和liburcu库
  9. AppCan VS PhoneGap - 对比两大移动开发平台
  10. Aptana Studio 介绍