C++ std::map 和 std::vector 的优点? [关闭]

Posted

技术标签:

【中文标题】C++ std::map 和 std::vector 的优点? [关闭]【英文标题】:Advantages of C++ std::map and std::vector? [closed] 【发布时间】:2013-01-09 20:42:42 【问题描述】:

周末我将参加一个编程比赛,我想知道我应该使用std::vector还是std::map?我会简单地将它们用作数组,但我很困惑哪个更好(主要是基本操作的速度)?

我在 *** 上看到了这张图片,但我不知道它们之间的主要区别是什么......

图片表明矢量更快... 我真的不知道该怎么办请帮助我!我只需要像数组一样使用它们,但具有动态大小...... 提前致谢,

编辑 我可能会得到一个整数的二维数组(例如,城市或迷宫的地图,我会遇到一些可以用图形算法或动态编程解决的问题),所以我需要的东西是:写,读“表”的特定单元格,搜索特定值,我想就是这样。 我听说 std::map 不会在内存中找到完整的 N*M 大小的表,但我会按值逐个进行......那么它可能会使用更少的内存是真的吗?

抱歉这么愚蠢,但我从来没有真正的老师,我学到了我所知道的一切。我刚开始学习数据结构(2-3棵树、红黑树、二项式堆等等……)

【问题讨论】:

了解这两者之间的差异是否重要? 您将关联容器与顺序容器进行比较,这有什么意义?这就像问船是否比汽车快 - 你可以得到一个有效的答案,但它们是满足完全不同需求的工具。 “图片表明矢量更快......”在特定时间特定机器上的特定任务 @nábob: vector 是一个有序的元素序列;您按顺序存储元素并有一个整数来引用每个元素; map 是一个关联容器 - 您存储键值对(只要满足某些约束,它们都可以是任何类型),您可以通过指定相应的键来检索每个值。您可以将矢量视为书架之类的东西,而地图更像是一本字典。 @nábob:整数键很好,如果你需要的话。如果你需要索引,那是向量。您甚至可以通过使用键作为索引在向量上实现自己的映射,尽管您的键很稀疏,您会浪费空间等。这一切都取决于。您需要退后一步并理解这一点:停止尝试直接比较它们。了解每个人单独做什么。 【参考方案1】:

我想知道我应该使用std::vector还是std::map

这完全取决于您想要/需要做什么。如果您需要输入用户的 2 个数字,将它们相加并显示结果,那么使用矢量或地图。

但是,如果您需要存储对象(或基元)数组,std::vector 通常是要走的路。如果您需要存储键和值,那么 std::map 就是为此而发明的。你问的问题太宽泛了,所以实际上很难回答,但你可能还是明白了。

此外,您还可以从代码中获得一些灵感,而这些代码绝不应该尝试复制here。

【讨论】:

我试图完善我的问题:我需要使用某种二维整数数组,例如城市地图或类似的东西:)。我听说如果我不填充“表”/数组的所有单元格,std::map 会使用更少的内存,对吗? @nábob 好问题,听起来你需要启动一个基准测试工具:) nabob 如果不是数组的所有元素都将被填充,您可以创建一个稀疏矩阵。有几种不同的表示用于执行此操作。但是,您应该意识到,您将在速度方面受到影响。你真的不能比连续的内存块更快。 @nábob 你也可以创建一个向量向量。或者,如果您需要一个简单的标量数组(例如数字),它可能不会改变其大小,您可以通过创建一个普通的旧二维数组来生存:int matrix[w][h]; - 但同样,我们更容易给出一个如果您将问题缩小到实际问题,则可以得到合理的答案。【参考方案2】:

std::map 不是数组,而是红黑二叉树。因此,作为基本的数组存储,它不是一个好的选择。

std::vector 可以用作数组,并且可能会提供与数组相似的访问速度(虽然它可能取决于实现,但如果不是全部的话,大多数都将被实现为数组)。 std::vector 的优势不是速度,而是它为你管理内存。

此外,您可能还想了解不同的数据结构。这将有助于扩展您的编程技能。

【讨论】:

std::map 怎么会是一棵红黑树? o.O 它是一个键值存储。它可以使用红黑树来实现(虽然没有多大意义),但这是一个实现细节。 我应该说它是二叉树,虽然我见过的实现是红黑树。你说这没有意义是什么意思?如果你想要一个哈希映射,你可以使用 std::hash_map 代替。然而,它不仅仅是一个实现细节。你应该知道你正在使用的底层算法。 更多关于 std::map 实现的讨论:***.com/questions/5288320/…【参考方案3】:

您是指 C 意义上的字符数组还是数学意义上的数组?你的数组是多维的吗?

如果您指的是数学类型,您可能会发现将数组存储在堆中分配的空间中并通过执行一个新的、更大的 malloc 后跟一个 memcopy 并释放旧的分配区域来调整大小可能比使用 std 更快:容器。

不要被 std: 构造函数所迷惑,它们听起来像是在按空间分配你需要的东西。他们在构造函数时分配了太多的空间,所以如果他们没有这个,他们就不必像他们可能的那样经常增长。当它们确实必须增长时,它们会再次出于完全相同的原因再次要求额外的空间。当您确实必须扩展空间时,请记住使用最大的数据项移动数据。假设您有 64 位总线并且字符一次移动一个并且您的编译器不够聪明,无法为您优化这一点,那么 long 的移动速度比 N 字节快 1/64。

【讨论】:

以上是关于C++ std::map 和 std::vector 的优点? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::map 和 std::unordered_map 区别 时间复杂度 适用

C++ 将预先保留的哈希映射(std::unordered_map)与整数键和连续数据数组(std::vector)进行比较

模板类值的 C++ std::map

C++ std::unordered_map 中使用的默认哈希函数是啥?

C++ std::map 持有任何类型的值

C++ std::map