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++标准库之容器的更多相关文章

  1. 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  2. 把《c++ primer》读薄(3-3 标准库bitset类型)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...

  3. C++标准库(体系结构与内核分析)(侯捷第一讲)

    一.C++标准库介绍 C++标准库:C++ Standard Library C++标准库与STL有什么关系: STL:Standard Template Library STL包含6大部件,基本占标 ...

  4. c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

    转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...

  5. STL标准模板库 向量容器(vector)

    向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...

  6. STL标准库-容器-set与multiset

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...

  7. STL标准库-容器-deque

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...

  8. STL标准库-容器-list

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任 ...

  9. STL标准库-容器-vector

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...

随机推荐

  1. ios滚动UIScrollView的setContentOffset方法

    在UIScrollView,setContentOffset方法的功能是跳转到你指定内容的坐标,[self.scroview setContentOffset:CGPointMake(0, 50) a ...

  2. 解决IIS服务和用户上传的文件分别部署在不同的电脑上时,解决权限的问题

    为解决IIS服务和用户上传的文件分别部署在不同的电脑上时,解决权限的问题. 定义: A:iis服务器 B:文件服务器 步骤: 1.在B上创建一个用户[uploaduser](并设置密码) 2.给B上的 ...

  3. csharp 面向对象编程

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shap ...

  4. mac更新系统后Git不能用,提示missing xcrun at

    今天更新了mac系统,然后就踩了这个坑. 启动AndroidStudio 右上角提示: can't start git: /usr/bin/git probably the path to git e ...

  5. python——异常except语句用法与引发异常

    except: #捕获所有异常 except: <异常名>: #捕获指定异常 except:<异常名1,异常名2):捕获异常1或者异常2 except:<异常名>,< ...

  6. loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式

    loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...

  7. [1-2] 把时间当做朋友(李笑来)Chapter 2 【开启自己的心智】 摘录

    心智是可培养的.可发展的.甚至是可以重建的 早意识到,早些培养可以让自己起步更早些 审视一下我们自己,运用自己的心智,我们会知道每个人可以把自己划分为两部分:自己知道的与自己并不知道的.我们有的时候并 ...

  8. VC 使用json cpp 静态库 问题解决

    release使用 json 静态库 提示 fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_writer ...

  9. CF 316div2 E.Pig and Palindromes

    E. Pig and Palindromes Peppa the Pig was walking and walked into the forest. What a strange coincide ...

  10. Redis之ziplist数据结构

    0.前言 redis初始创建hash表,有序集合,链表时, 存储结构采用一种ziplist的存储结构, 这种结构内存排列更紧密, 能提高访存性能. 本文介绍ziplist数据结构 1.ziplist存 ...