`

vector list deque 比较

 
阅读更多

http://blog.csdn.net/renkaihao/article/details/6803866

 

stl提供了三个最基本的容器:vector,list,deque。

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

list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:
它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。

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

 

 

vector为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高。在vecotor中插入或者删除某个元素,需要将现有元素进行复制,移动。如果vector中存储的对象很大,或者构造函数复杂,则在对现有元素进行拷贝时开销较大,因为拷贝对象要调用拷贝构造函数。对于简单的小对象,vector的效率优于list。vector在每次扩张容量的时候,将容量扩展2倍,这样对于小对象来说,效率是很高的。

list中的对象是离散存储的,随机访问某个元素需要遍历list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改变元素的指针。

综上所述:

vector适用:对象数量变化少,简单对象,随机访问元素频繁

list适用:对象数量变化大,对象复杂,插入和删除频】

分享到:
评论

相关推荐

    STL中vector、list、deque和map的区别

    STL中vector、list、deque和map的区别

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

    在这个"STL.zip"压缩包中,包含了对vector和deque两种重要容器的自定义实现,以及一系列用于测试这些数据结构的用例。下面我们将深入探讨这两个容器及其相关的编程概念。 首先,`vector`是STL中最常见的动态数组,...

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

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

    vector操作vector操作vector操作

    在深入探讨STL(Standard Template Library)中的容器如`vector`、`list`与`deque`的操作之前,我们首先简要回顾一下这些容器的基本概念及其在C++编程环境中的重要性。`vector`、`list`和`deque`是STL中三种基本的...

    list和vector的区别共1页.pdf.zip

    以下是关于`list`和`vector`的详细比较: 1. **实现方式** - `list`:`list`是一个双向链表,每个元素都是一个节点,包含实际的数据以及指向前后节点的指针。因此,元素在链表中的插入和删除操作相对较快。 - `...

    vector等容器的用法

    本篇文章将深入探讨`vector`、`list`和`deque`这三种常见容器的用法,特别关注`vector`的详细操作。 `vector`是一种动态数组,它提供了类似于数组的功能,但具有自动扩展的能力。`vector`的主要特点和操作包括: 1...

    C++ STL vector 容器介绍

    学习`vector`容器时,还需要理解其与其他STL容器如`deque`、`list`和`array`的区别,以便在不同的场景下选择最合适的容器。例如,`deque`在两端插入和删除更高效,`list`则适合频繁的插入和删除,而`array`是固定...

    deque dll.rar

    相比于其他STL容器,如vector和list,deque具有以下特点: 1. **高效随机访问**:deque支持O(1)时间复杂度的随机访问,这使得在任何位置读取或修改元素都非常快速。 2. **灵活的插入和删除**:可以在deque的两端...

    演示Sequence容器vector

    本篇文章将专注于一种重要的Sequence容器——`vector`,并探讨其与其他Sequence容器如`list`和`deque`的使用、性能差异以及内部实现原理。 首先,`vector`是一种动态数组,它支持随机访问和连续存储。在构造`vector...

    STL_Depue_Vector_Compare

    6. **与其他容器的比较**:`std::vector`与`std::deque`、`std::list`等其他STL容器在不同操作上的性能对比,可以帮助选择适合特定应用场景的容器。 **总结** “STL_Depue_Vector_Compare”可能是一个关于`std::...

    vector用法的源代码资源

    七、`vector`与其他容器的比较 - `array`:静态大小,不能动态调整,但没有内存开销。 - `deque`:提供类似`vector`的功能,但在两端插入和删除更快,但内存分布不连续。 - `list`和`forward_list`:使用链接节点...

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

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

    vector定义和初始化

    因此,对于频繁在开头或中间插入/删除元素的情况,`list`或`deque`可能是更好的选择。 ### 示例代码 下面的示例展示了如何使用`vector`定义、初始化、插入、删除和访问元素: ```cpp #include #include <vector> ...

    how to use vector

    2. **与`std::deque`**:`std::deque`在某些操作(如两端插入)上可能比`std::vector`更快,但内存分布不如`std::vector`连续。 3. **与`std::list`**:`std::list`在插入和删除操作上更高效,但查找和随机访问效率...

    vector中的排序的源代码资源

    在处理大量数据或性能敏感的场景下,可以考虑使用其他数据结构,如`std::list`(虽然`std::list`排序的效率较低)或`std::set`(适用于不重复元素且需要保持排序的场景),或者直接使用已排序的`std::deque`或`std::...

    第9章 顺序容器1

    顺序容器按照元素在内存中的排列顺序来访问和操作这些元素,包括vector、deque、list、forward_list以及array和string。这些容器各自有不同的特点和性能表现。 **vector** 是一个可变大小的数组,支持快速的随机...

    vector使用的一个简单例子

    - 插入或删除元素可能涉及元素的移动,这在性能上可能比其他容器(如`deque`或`list`)更昂贵。 - 避免不必要的`resize()`操作,因为这可能导致内存重新分配和元素拷贝。 - 使用`reserve()`预分配内存可避免频繁的扩...

    【c++】STL之list用法总结

    list的内部构造完全不同于array,vector或deque。 list就是双向链表。与之相似的forward_list是单向链表,可以理解为forward_list是一个行动受限的list,凡是list没提供的功能,forward_list也不提供,forward_list...

    vc++中队列deque和queue的使用

    ### `queue`和`deque`的比较 - **效率**:在大多数情况下,`queue`基于`deque`实现,因此两者在操作效率上相差不大。但在特定条件下,如频繁在队首进行操作时,`deque`可能会优于`list`(另一种可能的选择)。 - **...

    测试Vector

    3. **考虑其他容器**:如果插入和删除操作非常频繁,且顺序不重要,可以考虑使用`std::list`或`std::deque`等其他STL容器,它们在插入和删除上的效率可能更高。 4. **及时释放资源**:确保在不再需要`std::vector`时...

Global site tag (gtag.js) - Google Analytics