C++ Map 不应该是随机访问数据结构,而不是双向访问数据结构吗?

Posted

技术标签:

【中文标题】C++ Map 不应该是随机访问数据结构,而不是双向访问数据结构吗?【英文标题】:Shouldn't C++ Map be a random access data structure, rather than a bidirectional access data structure? 【发布时间】:2020-02-05 09:50:17 【问题描述】:

为什么map是双向数据结构。如果我们知道使用它的键,我们可以很容易地访问任何元素,就像一个随机访问数据结构的数组一样?那么地图不应该是一个随机访问的数据结构,因为我们可以访问它的任何数据而不必访问它之前的任何元素。

【问题讨论】:

我不知道您所说的“双向数据结构”,但按照标准,std::map 属于 关联容器 系列。它将键与值相关联。您可以随心所欲地随机访问它,但只能通过密钥。它的迭代只是双向的。 @mudit rustagi 如果您想要一个对访问元素具有恒定复杂性的地图,您可能想看看std::unordered_map,它是用哈希表实现的,而不是像@ 这样的树987654323@ @muditrustagi 您似乎将std::mapstd::unordered_map 混淆了。只有后者被实现为“哈希映射”。 std::map 通常实现为红黑树,因此使用二分查找找到项目(复杂度O(log n))。 std::unordered_map迭代 只是向前的,尽管它是“随机访问”查找 【参考方案1】:

没有。

RandomAccessIterator 概念扩展了BidirectionalIterator,还要求您可以向迭代器添加一个数字

这与key_typeAssociativeContainerUnorderedAssociativeContainer 没有没有关系。在“mudit”上加 5 是什么意思?

【讨论】:

【参考方案2】:

为什么map是双向数据结构

为什么你认为 map 一个“双向数据结构”?

C++ Map 不应该是随机存取数据结构

为什么你认为它不是

您为什么认为“双向”和“随机访问”是互斥的?

说真的,无论来源给你这些术语是错误的,还是你误解了它。如果你不说你的错误假设来自哪里,我们无法帮助你。

如果我们知道使用它的键,我们可以很容易地访问任何元素,就像一个随机访问数据结构的数组一样?

是的,std::map 模型 AssociativeContainer 与您期望的一样。

那么地图不应该是随机存取数据结构

您是否想问为什么地图不被称为“随机访问数据结构”?那只是因为我们称它为AssociativeContainer,但意思差不多。

您是否想问为什么 map 在现实中不是随机访问,即使它支持按键查找?然后你必须告诉我们你所说的“随机访问”是什么意思除了能够按键查找。

查找操作是对数的,而不是恒定的复杂性,如果这是您要绘制的区别,因为 map 是一个 排序 关联容器。

map 的迭代器是双向的这一事实不会影响您通过键查找元素的方式。这只是意味着一旦你找到(指向的迭代器)一个元素,你就可以按照排序顺序向前或向后遍历它的邻居。

【讨论】:

以上是关于C++ Map 不应该是随机访问数据结构,而不是双向访问数据结构吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中生成随机双精度数

QMap 和map哪个效率高?

c++ list, vector, map, set 区别与用法比较

用于一次性查找但多次遍历和访问的容器的 C++ 有效方法

Go Map 为啥是非线程安全的?

C++ 标准容器的线程安全