【问题标题】:Shouldn't C++ Map be a random access data structure, rather than a bidirectional access data structure?C++ Map 不应该是随机访问数据结构,而不是双向访问数据结构吗?
【发布时间】: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迭代 只是向前的,尽管它是“随机访问”查找

标签: c++ dictionary bidirectional random-access


【解决方案1】:

没有。

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

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

【讨论】:

    【解决方案2】:

    为什么map是双向数据结构

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

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

    为什么你认为它不是

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 2015-08-01
      • 2016-12-11
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      相关资源
      最近更新 更多