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

发布网友 发布时间:2022-04-25 19:05

我来回答

1个回答

热心网友 时间:2022-04-12 12:26

STL 容器
Visual Studio 2013
其他版本

1(共 1)对本文的评价是有帮助 - 评价此主题
ISO 标准模板库 (STL) 为存储相关对象的集合提供容器。 容器是能够启用容器中允许的对象规范的模板类。

说明

本文不适用于 STL/CLR。 有关更多信息,请参见 STL/CLR 库参考。

STL 中的容器可以分为三个类别:序列容器、关联容器和容器适配器。

序列容器

序列容器维护你指定的插入元素的顺序。
vector 容器的行为类似于数组,但可以根据要求自动增长。 它可以随机访问、连续存储,长度也非常灵活。 基于上述和其他原因,vector 是多数应用程序的首选序列容器。 有关更多信息,请参见 vector 类。
array 容器具备 vector 的某些优点,但长度不够灵活。 有关更多信息,请参见 array 类 (STL)。
deque(双端队列)容器支持在容器的起点和终点进行快速插入和删除。 它享有 vector 随机访问和长度灵活的优点,但是不具备连续性。 有关更多信息,请参见 deque 类。
list容器是双向链表,在容器内的任意位置启用了双向访问、快速插入和快速删除,但是你不能随机访问此容器中的元素。 有关更多信息,请参见 list 类。
forward_list 容器是单独链表,list 的向前访问版本。 有关更多信息,请参见 forward_list 类。

关联容器

在关联容器中,按照预定义的顺序插入元素,例如按升序排序。 无序的关联容器也可用。 关联容器可分为两个子集:映射和组集。
map,有时称为字典,包含键/值对。 键用于对序列排序,值与该键关联。 例如,map可能包含许多键(代表文本中每个独特的单词)和相应的值(代表每个单词在文本中出现的次数)。 map的无序版本是 unordered_map。有关更多信息,请参见map 类和unordered_map 类。
set仅是按升序排列每个元素的容器,值也是键。 set的无序版本是 unordered_set。 有关更多信息,请参见set 类和unordered_set 类。
map 和 set 都仅允许将键或元素的一个实例插入容器中。 如果需要元素的多个实例,请使用multimap或multiset。 无序版本是 unordered_multimap 和 unordered_multiset。 有关更多信息,请参见 multimap 类、unordered_multimap 类、multiset 类和 unordered_multiset 类。
有序的映射和组集支持双向迭代器,其未排序副本支持向前迭代器。 有关更多信息,请参见迭代器。

容器适配器

容器适配器是序列容器或关联容器的变体,为了简单明确起见,它对接口进行*。 容器适配器不支持迭代器。
queue容器遵循 FIFO(先进先出)语义。 第一个推送(即插入队列中)的元素将第一个弹出(即从队列中移除)。 有关更多信息,请参见 queue 类。
priority_queue容器也是如此组织,因此具有最高值的元素始终排在队列的第一位。 有关更多信息,请参见 priority_queue 类。
stack容器遵循 LIFO(后进先出)语义。 堆栈上最后推送的元素将第一个弹出。 有关更多信息,请参见 stack 类。
由于容器适配器不支持迭代器,因此无法与 STL 算法一起使用。 有关更多信息,请参见算法。

容器元素的要求

通常,如果插入 STL 容器中的元素可复制,那么这些元素可以是任何对象类型。 只要你不调用尝试复制元素的成员函数,仅可移动的元素(例如,那些类似于 vector<unique_ptr<T>>、使用 unique_ptr<> 创建的元素)会一直工作。
析构函数不允许引发异常。
有序的关联容器(本文之前所述)必须已定义公共比较运算符。(默认情况下,该运算符是 operator<,即使不能与 operator< 共同使用的类型也会受支持。)
容器中的某些操作可能还需要公共默认构造函数和公共等效运算符。 例如,未排序的关联容器需要支持相等性和哈希处理。

http://msdn。microsoft。com/zh-cn/library/1fe2x6kt。aspx

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com