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::map
与std::unordered_map
混淆了。只有后者被实现为“哈希映射”。
std::map
通常实现为红黑树,因此使用二分查找找到项目(复杂度O(log n)
)。
而std::unordered_map
的迭代 只是向前的,尽管它是“随机访问”查找
【参考方案1】:
没有。
RandomAccessIterator 概念扩展了BidirectionalIterator,还要求您可以向迭代器添加一个数字。
这与key_type
的AssociativeContainer 或UnorderedAssociativeContainer 没有没有关系。在“mudit”上加 5 是什么意思?
【讨论】:
【参考方案2】:为什么map是双向数据结构
为什么你认为 map 是一个“双向数据结构”?
C++ Map 不应该是随机存取数据结构
为什么你认为它不是?
您为什么认为“双向”和“随机访问”是互斥的?
说真的,无论来源给你这些术语是错误的,还是你误解了它。如果你不说你的错误假设来自哪里,我们无法帮助你。
如果我们知道使用它的键,我们可以很容易地访问任何元素,就像一个随机访问数据结构的数组一样?
是的,std::map
模型 AssociativeContainer 与您期望的一样。
那么地图不应该是随机存取数据结构
您是否想问为什么地图不被称为“随机访问数据结构”?那只是因为我们称它为AssociativeContainer,但意思差不多。
您是否想问为什么 map 在现实中不是随机访问,即使它支持按键查找?然后你必须告诉我们你所说的“随机访问”是什么意思除了能够按键查找。
查找操作是对数的,而不是恒定的复杂性,如果这是您要绘制的区别,因为 map 是一个 排序 关联容器。
map 的迭代器是双向的这一事实不会影响您通过键查找元素的方式。这只是意味着一旦你找到(指向的迭代器)一个元素,你就可以按照排序顺序向前或向后遍历它的邻居。
【讨论】:
以上是关于C++ Map 不应该是随机访问数据结构,而不是双向访问数据结构吗?的主要内容,如果未能解决你的问题,请参考以下文章