c++标准库之容器
C++最原始的容器之一是数组。数组的特点有:
1.大小固定
2.单独存在的数组建立在栈上,作为对象成员存在的数组建立在堆上还是栈上则要看作为宿主对象是被建立在堆上还是栈上。栈空间是有限的,所以如果数组在栈上,则不能容纳太多元素,否则会导致stack overflow。
C++最原始的容器之二则是用一个指针指向从堆上申请的一块连续的内存。它的特点有:
1.大小固定
2.因其建立在堆上,所以容器大小不受栈大小的限制,可以很大。
array
数组在使用上有诸多不遍,如求数组长度,得sizeof(数组)/sizeof(元素),而且数组不支持赋值、交换、比较,所以就有了array。array是对数组的包装,对其绑定了一些常用的操作,使其用起来更顺手。理论上来说,因为多了一层包装,时间效率会低一点,但编译器优化后就没区别了。所以array是改良的数组,但它还是保留了数组的所有特点:大小固定,而且要小心stack overflow。
vector
array是对数组的包装,vector则是对指针的包装。vector去掉了基本容器大小固定的特点,当申请的堆内存不够存放新的元素后,vector会申请一块更大的内存来存储元素,然后释放掉旧的内存。vector相对于数组、指针、array来说是功能最强大、最普适的容器,但同时也是访问效率最低的。
deque
vector是一块连续的内存,因此只有在尾部进行插入、删除才高效,其它位置都要进行move操作。vector的内存增长时也会导致旧内存上的元素都要move一遍。而且vector的内存大小只增不减。deque采用多块连续内存的机制,在头部、尾部都可以高效的插入、删除。而且deque的内存大小能根据元素多少而动态增长、缩减,同时内存在增长的时候也不会把所有元素都move一遍。但deque的访问时间效率要比vector低很多了。
list
数组、指针、array、vector、deque都支持通过下标随机访问元素,list本质上是双向链表,所以不支持下标访问。但list的优点在于在任何位置插入、删除都是常量时间,除头尾外,比vector、deque要高效。
forward_list
forward_list本质上是单向链表,设计初衷是为了省空间(连size函数都省了)。forward_list不支持下标访问,操作方式也与其它的容器不同,vector、list的insert、erase操作都是删除iterator所指的元素,而forward_list则是删除iterator所指元素之后的元素。
set
关联容器,set对应的概念为集合,其优点在于可快速查找。
map
关联容器,map对应的概念为字典表,其优点也在于可快速查找。
c++标准库之容器的更多相关文章
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...
- 把《c++ primer》读薄(3-3 标准库bitset类型)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...
- C++标准库(体系结构与内核分析)(侯捷第一讲)
一.C++标准库介绍 C++标准库:C++ Standard Library C++标准库与STL有什么关系: STL:Standard Template Library STL包含6大部件,基本占标 ...
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...
- STL标准模板库 向量容器(vector)
向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
- STL标准库-容器-deque
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...
- STL标准库-容器-list
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任 ...
- STL标准库-容器-vector
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...
随机推荐
- SQL Server 基础 之 CASE 子句
SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS 'Last Digit',-- 求最后一位的值 Position = CASE SalesOrderI ...
- 算法导论-顺序统计-快速求第i小的元素
目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计 ...
- Yii2.0源码分析之——控制器文件分析(Controller.php)创建动作、执行动作
在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager解析出route,再在Module中根据route来创建contr ...
- druid.io使用技术简介: Hyperloglog
druid.io 使用Hyperloglog 估计基数 参照如下连接 http://blog.codinglabs.org/articles/algorithms-for-cardinality-es ...
- java 入门-helloWorld
Java 教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. ...
- java常用英语单词
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...
- html checkbox 实现全选/取消全选
html checkbox 实现全选/取消全选 <html> <body> <table border="1"> <tr> < ...
- UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
今天遇到一个问题,如下图: 假如你在一个BP的初始化脚本里用了"Get Player Character",编译BP时候就会遇到上述警告(Warning Function ' Ge ...
- android adt 最新下载地址
打开这个网址就可以看到adt的详细信息: http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse ...
- 工作总结 input 限制字数 textarea限制字数
最大能输入50个字 复制粘贴也不行 <textarea maxlength="50" class=" smallarea" cols="60& ...