`

stl容器区别: vector list deque set map [转]

 
阅读更多

 

 

stl容器区别: vector list deque set map [转]

 

 

转自:http://blog.csdn.net/lmh12506/article/details/8445025

 

在STL中基本容器有: vector、list、deque、set、map

 

set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问

 

set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少
map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了
底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响.

 

vector、list、deque是有序容器
1.vector
vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放.如果新值>当前大小时才会再分配内存.

 

它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。

对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要

 

 

 

对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高 (最好将结构或类的指针放入vector中,而不是结构或类本身,这样可以避免移动时的构造与析构)。
访问方面,对任何元素的访问都是O(1),也就是是常数的,所以vector常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作.

 

相比较可以看到vector的属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存.

capacity()返回vector所能容纳的元素数量(在不重新分配内存的情况下)      测试push_back  1000个数据  capacity返回16384

 

 

总结
需要经常随机访问请用vector

 

2.list
list就是双向链表,元素也是在堆中存放,每个元素都是放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

 

list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存.

 

list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机操作容器.
但是访问list里面的元素时就开始和最后访问最快
访问其它元素都是O(n) ,所以如果需要经常随机访问的话,还是使用其它的好

 

总结
如果你喜欢经常添加删除大对象的话,那么请使用list
要保存的对象不大,构造与析构操作不复杂,那么可以使用vector代替
list<指针>完全是性能最低的做法,这种情况下还是使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存

3.deque
deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下:
[堆1]
...
[堆2]
...
[堆3]
每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品.

 

它支持[]操作符,也就是支持随即存取,可以让你在前面快速地添加删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度,和 vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作 上与list的效率也差不多。
在标准库中vector和deque提供几乎相同的接口,在结构上它们的区别主要在于这两种容器在组织内存上不一样,deque是按页或块来分配存储器 的,每页包含固定数目的元素.相反vector分配一段连续的内存,vector只是在序列的尾段插入元素时才有效率,而deque的分页组织方式即使在 容器的前端也可以提供常数时间的insert和erase操作,而且在体积增长方面也比vector更具有效率

 

总结:
vector是可以快速地在最后添加删除元素,并可以快速地访问任意元素
list是可以快速地在所有地方添加删除元素,但是只能快速地访问最开始与最后的元素
deque在开始和最后添加元素都一样快,并提供了随机访问方法,像vector一样使用[]访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转
deque也有保留空间.另外,由于deque不要求连续空间,所以可以保存的元素比vector更大,这点也要注意一下.还有就是在前面和后面添加元素时都不需要移动其它块的元素,所以性能也很高。

 

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

分享到:
评论

相关推荐

    C++STL vector list map set dqueue 等应用举例及PPT讲解示例,代码演示

    在这个主题中,我们将深入探讨vector、list、map、set和deque这五个主要的STL容器,并通过具体的例子和PPT讲解来理解它们的应用。 1. **vector**:vector是动态数组,它可以方便地在任何位置插入和删除元素,但主要...

    STL.zip包含vector,deque和丰富的测试用例

    这对于学习STL的工作原理、优化代码性能以及理解和实现其他容器(如list、set、map等)都是非常有价值的实践。 总之,这个"STL.zip"压缩包为学习和实践C++ STL提供了很好的素材,涵盖了面向对象编程中的模板、容器...

    stl_test:STL中deque、list、vector、stack、map、set、hashmap的基本应用

    在这个名为“stl_test”的项目中,我们主要关注STL中的几种容器:deque(双端队列)、list(链表)、vector(动态数组)、stack(栈)、map(关联数组)、set(集合)以及hashmap(哈希表)。这些容器在不同的场景下...

    STL代码大全(容器,链表,栈,算法,排序等)

    `容器.cpp` 文件可能包含了多种不同类型的STL容器,如`std::vector`、`std::deque`、`std::set`、`std::unordered_set`等。容器是用来存储和管理对象的模板类。例如,`std::vector`提供动态数组的功能,而`std::set...

    c++容器使用经验

    标准STL序列容器:vector、string、deque和list。 标准STL关联容器:set、multiset、map和multimap。

    Effective STL中文版:50条有效使用STL的经验.zip

    2. **容器**:STL提供了多种容器,如vector、list、deque、set、map等,每种都有其特定的性能特征和用途。例如,vector适合随机访问,list适用于频繁插入和删除,而set和map则提供键值对的存储和查找。 3. **迭代器...

    stl练习题之四

    首先,STL容器类是C++程序员最常使用的工具之一,它们包括数组(如`std::array`)、顺序容器(如`std::vector`、`std::deque`和`std::list`)、关联容器(如`std::set`、`std::map`)以及非标准容器(如`std::stack`...

    STL容器的一些使用简介

    STL提供了多种容器,包括`vector`、`list`、`deque`、`set`、`map`等。 首先,让我们来谈谈`queue`容器。`queue`是一个先入先出(FIFO)的容器,提供了`push`、`pop`、`front`、`back`等操作: ```cpp std::queue...

    STL容器和算法函数表

    ### STL容器和算法函数表详解 #### 一、Vector类的主要成员 `vector&lt;T&gt;`是C++标准模板库(STL)中的动态数组实现,能够自动调整其大小,提供了高效的随机访问能力,是C++中最常用的数据结构之一。 ##### 容器属性 -...

    STL.rar_C++ STL_STL_site:www.pudn.com_visual c

    1. 容器:STL提供了多种容器,如vector、list、deque、set、map等,它们分别代表了不同类型的动态数组、链表、双端队列、集合和关联数组。例如,vector是一个动态数组,允许高效地在末尾添加和删除元素;list则是一...

    stl容器.zip

    例如,使用`push_back()`向vector添加元素,使用`insert()`在list中插入元素,使用`find()`在set或map中查找特定元素,以及利用迭代器遍历容器并执行操作等。 通过学习和实践这个项目,你将更好地理解STL容器的工作...

    c++STL容器讲义与演示

    主要有四大类容器:顺序容器(如vector、deque、list)、关联容器(如set、map)、容器适配器(如stack、queue、priority_queue)以及未分类容器(如unordered_set、unordered_map)。这些容器各自有不同的特性和...

    C++ STL开发技术导引(第5章)

    第10章 bit_vector位向量容器 149 10.1 bit_vector技术原理 149 10.2 bit_vector应用基础 156 10.3 本章小结 161 第11章 set集合容器 162 11.1 set技术原理 162 11.2 set应用基础 181 11.3 本章小结...

    关于STL的erase()陷阱-迭代器失效问题的总结

    STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。 1.list,set...

    STL学习必备:Effective-STL,STL_Programmer_Guider,TheC++StandardLibrary打包下载

    1. 容器:容器是STL的核心,如vector、list、deque、set和map等,它们分别代表动态数组、链表、双端队列、关联集合和映射等数据结构。每种容器都有其特定的性能特点和适用场景。 2. 迭代器:迭代器是STL的桥梁,它...

    STL容器(一)(附件STL帮助手册)

    1. 容器概述:STL提供了多种容器,如vector、list、deque、set、map等,它们都是用来存储和管理对象的类模板。每个容器都有其特定的设计目标和性能特点,开发者可以根据实际需求选择合适的容器。 2. vector:这是最...

    STL容器使用代码

    在STL中,容器是一类能够存储数据的对象,包括vector、string、deque、queue、list、set、multiset、map和multimap。下面将详细介绍这些容器的使用和API方法。 1. **vector**:动态数组,可以自动扩展其大小。常用...

    STL学习,总结了map、vector、list的简单操作

    本篇文章将详细讲解STL中的三个核心容器:map、vector和list,以及它们的基本操作。 首先,我们来看**map**。Map是一个关联容器,它存储键值对(key-value pairs),每个键都是唯一的。键和对应的值通过一对尖括号...

    STL -容器,string容器

    常见的序列式容器有vector、list、deque等。 关联式容器的特点是无需强调元素的物理顺序,各元素之间没有严格的物理上的顺序关系。常见的关联式容器有set、map等。 在STL容器中,string容器是最常用的容器之一。...

    STL.rar_STL_site:www.pudn.com

    1. 容器:这是STL中用于存储数据的主要结构,包括vector(动态数组)、list(双向链表)、deque(双端队列)、set(红黑树实现的集合)、map(键值对映射)等。每个容器都有其特定的访问和操作方式,例如vector支持...

Global site tag (gtag.js) - Google Analytics