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对应的概念为字典表,其优点也在于可快速查找。
转自:http://www.cnblogs.com/vsuu/p/4191239.html
c++标准库容器【转】的更多相关文章
- STL标准库-容器-set与map
STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
- STL标准库-容器-deque
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...
- STL标准库-容器-list
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任 ...
- STL标准库-容器-vector
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...
- STL标准库-容器适配器
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class ...
- STL标准库-容器-unordered_set
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 unordered_set与与unordered_map相似,这次主要介绍unordered_set unordered_set ...
- STL标准库-容器-rb_tree
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 红黑树,关联式容器底层实现(map set),在使用中基本运用不到,但是还是想了解一下他的运作方式 Red_Black tree ...
- STL标准库-容器-map和multimap
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此ma ...
随机推荐
- ubuntu16.04下安装配置深度学习环境(一、cuda7.5的安装)
1.下载所需要的软件 cuda7.5下载(点击下载链接),cudnn4.0下载 2.安装NVIDIA驱动. 一般有两种方法:1)一种方法是利用"软件和更新"来安装,依次选择 系统设 ...
- JSP中三种弹出对话框的用法《转》
对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...
- Matlab立体标定mat转换成Opencv的CvMat
最近在做基于双目视觉的三维重建.比较opencv和matlab工具箱的立体标定结果精度时,发现貌似如果手工选取角点不那么离谱的话,matlab标定结果精度更高也更鲁棒.就想先用matlab标定好相机, ...
- Laravel使用Seeder自动填充数据
要查看代码,可以点击 或者转到链接:https://github.com/laravel/framework Laravel自动填充数据使用的是Seeder类 <?php use Illumin ...
- Laravel事件Event
适用场景:记录文章浏览量 php artisan make:event 事件名 示例: php artisan make:event MyEvent Laravel目录\app\Events已经生成M ...
- 《类型编程晋级——shapeless类库使用指南》前言及第一章翻译
从年初开始进行此项工作,我和合作伙伴包亮付出了大量而艰辛的劳动,现基本翻译完毕,有出版意向,如果有意向欢迎联系,不甚感激!也欢迎各位博友对此翻译提出意见建议以及指导如何出版,在此谢过! 前言 时间回到 ...
- Flume-ng源码解析之启动流程
今天我们通过阅读Flume-NG的源码来看看Flume的整个启动流程,废话不多说,翠花,上源码!! 1 主类也是启动类 在这里我贴出Application中跟启动有关的方法,其他你们可以自己看源码,毕 ...
- ACM 序号互换
序号互换 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来.单元格的行坐标是由数字 ...
- 《C++之那些年踩过的坑(二)》
C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...
- 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...