Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;deque vs vector和C++;映射与集合_C++_Stl - Fatal编程技术网

C++ C++;deque vs vector和C++;映射与集合

C++ C++;deque vs vector和C++;映射与集合,c++,stl,C++,Stl,有人能告诉我vector和deque的区别吗。我知道C++中的矢量实现,但不知道DEQUE。地图和集合的界面也和我很相似。两者之间的区别以及何时使用两者。set:保存唯一值。把“a”放进两次,这组就有一个“a”。 映射:将键映射到值,例如“name”=>fred、“age”=>40。你可以查“名字”,然后把“弗雷德”弄出来 出列,类似于向量,但只能在末尾添加/删除。中间没有插入 编辑:缺少我的出列说明,请参见下面的注释以获得更正映射通常被称为关联数组,通常使用二叉树实现(例如)。deque是一个

有人能告诉我vector和deque的区别吗。我知道C++中的矢量实现,但不知道DEQUE。地图和集合的界面也和我很相似。两者之间的区别以及何时使用两者。

set:保存唯一值。把“a”放进两次,这组就有一个“a”。 映射:将键映射到值,例如“name”=>fred、“age”=>40。你可以查“名字”,然后把“弗雷德”弄出来

出列,类似于向量,但只能在末尾添加/删除。中间没有插入


编辑:缺少我的出列说明,请参见下面的注释以获得更正

映射通常被称为关联数组,通常使用二叉树实现(例如)。deque是一个双端队列,是链表的具体体现

这并不是说容器库的实际实现使用了这些概念——容器库将为您提供一些关于如何访问容器以及以什么(摊销)成本访问容器的保证

我建议您查看一份参考资料,详细说明这些担保是什么。ScottMeyers的书《有效的STL:改进标准模板库使用的50种具体方法》应该会讨论一下这些,如果我没记错的话。除此之外,C++标准显然是一个不错的选择。 我真正想说的是:容器实际上是由它们的属性来描述的,而不是由底层实现来描述的。

:一个动态数组类。内部内存分配确保始终创建一个数组。当数据的大小已知且已知不会经常更改时非常有用。当您想要随机访问元素时,它也很好。
:可以用作堆栈或队列的双端队列。适用于不确定元素数量以及访问数据元素时始终以串行方式。当从前端和后端添加/删除元素时,它们的速度很快,但当从中间添加/删除元素时,它们的速度就不快了。
:可用于创建数据“列表”的双链接列表。列表的优点是可以从列表的任何部分插入或删除元素,而不会影响指向列表成员(删除后仍然是列表成员)的迭代器。当您知道元素将经常从列表的任何部分删除时,此功能非常有用。
:将“键”映射到“值”的字典。对于索引不是整数的“数组”等应用程序非常有用。基本上可以用来创建一个元素的名称映射列表,比如存储名称与小部件关系的映射。

:唯一数据值列表。例如,如果插入1、2、2、1、3,则列表将仅包含元素1、2、3。请注意,此列表中的元素总是按顺序排列的。在内部,它们通常实现为二进制搜索树(如map)。

有关详细信息,请参见此处:

向量Vs德克 deque与矢量相同,但添加了以下内容:

  • 这是一个“前插入序列”
这意味着deque与矢量相同,但提供以下额外保证:

  • 向前推()O(1)
  • pop_front()O(1)
设置与映射 地图是“成对关联容器”,而集合是“简单关联容器”


这意味着它们完全相同。不同的是,MAP持有一对项目(键/值)而不是一个值。

我会说“DEQE,像一个向量,但是你可以在两端(而不是仅仅是后端)添加/删除。标准库DEGO支持中间插入,同样的线性复杂度由标准向量提供。其他的实现可能不会,因为它不是核心的“双端队列”思想的核心。但deque不像向量,因为连续元素在内存中不保证是连续的。如果您将足够多的元素推到数据块的一端,使其内部存储空间耗尽,它将分配一个新的存储块,并将其固定到一端或另一端。如果将足够多的元素推到向量的末尾,导致其容量不足,那么向量必须分配一个足够大的新块来容纳所有内容,将所有内容复制到该块,然后释放旧存储。要比一个德克慢得多,而且块的大小越来越大。我从来没有想到过这样的德克。我现在更可能使用一个,谢谢Drew&Mike
deque
在比
vector
更少的情况下重新定位元素,这可能不是因为时间复杂,而是因为您有对它们的引用。此外,deque和vector在内存管理方面也不相同。向量在内存中被保证是连续的(如C数组),而deque则不是。+1:您可能会提到
集合
实际上是一个
映射
,其值是键。您还可以提到
multimap
multiset
,以获取完整性。@John:谢谢您提到添加了关于集合的详细信息。我已经添加了这一部分。我忽略了multimap和multiset,因为OP更多的是向量、deque、map和set。我把它列在清单上是为了确保他知道这件事,以防这正是他想要的。另外,我没有使用multiset的经验。@John:集合不一定是地图。集合只需要存储密钥,映射必须为密钥和值分配存储。所以你可以说集合实际上是一个没有值的映射。