【问题标题】:unordered_map cbegin() + number //constant complexity?unordered_map cbegin() + number //恒定复杂度?
【发布时间】:2017-12-25 16:01:40
【问题描述】:

正如标题所说,我知道 unordered_map 的 cbegin() 具有恒定的复杂度,但它是恒定复杂度的迭代器的迭代。例如:cbegin()++; cbegin() + 10; cbegin() + i; cend()--; 所有这些都是 o(1) ???

【问题讨论】:

  • std::unordered_map 提供的迭代器是前向迭代器。前向迭代器不支持加法:cbegin()+10cbegin()+i 无效。前向迭代器不支持递减:cend()-- 无效。
  • std::unordered_map 可能实现为指向双向链表的指针哈希表,显然不支持随机访问迭代器

标签: c++ dictionary iterator complexity-theory unordered


【解决方案1】:

24.2.1 [iterator.requirements.general]

所有类别的迭代器只需要那些函数 可在恒定时间内实现给定类别(摊销)。 因此,迭代器的需求表并不复杂 列。

第一部分可能有点令人困惑,但它只是说并非所有迭代器类型都支持所有操作(即,前向迭代器不支持随机访问);但是那些定义的函数,它们总是have amortized constant complexity。该标准没有明确规定每个单独的迭代器方法的复杂性;在这个子句中,它似乎表明那些定义的迭代器方法必须具有分摊的常数复杂度。

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多