【问题标题】:Where does unordered_map<K, V>::iterator come from?unordered_map<K, V>::iterator 来自哪里?
【发布时间】:2018-04-07 07:08:33
【问题描述】:

当我使用std::unordered_map&lt;K, V&gt; 时,我知道每个键值对的迭代器都是std::unordered_map&lt;K, V&gt;::iterator 类型。我也知道迭代器本身指向pair&lt;const K, V&gt;。但是,我知道迭代器指向一对的唯一原因是查看示例代码。这种行为在哪里定义?

例如,如果我转到the documentation at cppreference.com,我看不到这种行为的解释。它只是说成员iterator 被定义为ForwardIterator

所以,我的问题是,聪明的开发人员怎么会知道std::unordered_map&lt;K, V&gt;::iterator 实际代表什么?我确信我缺少一些逻辑上的飞跃。

【问题讨论】:

  • 提到ForwardIterator 是一个可点击的链接。进一步感兴趣:“std::unordered_map 满足ContainerAllocatorAwareContainerUnorderedAssociativeContainer 的要求。”这些驼峰式标识符中的每一个也是链接,包含有关容器预期行为方式的更多信息。
  • cppreference.com 是一个公共维基。请修复该页面并使其更清晰。我也会这样做。
  • 完成。我编辑了页面并在此处添加了答案:stackoverflow.com/a/66164132/4561887。希望编辑坚持。如果没有,请改用 cplusplus.com 参考页 (cplusplus.com/reference/unordered_map/unordered_map),因为它说 iterator 是:a forward iterator to value_typeconst_iteratora forward iterator to const value_type ,并且将value_type 显示为pair&lt;const key_type,mapped_type&gt;

标签: c++ stl iterator


【解决方案1】:

对于 STL 容器

iterator 类型的对象在被取消引用时返回一个reference 类型的对象,它是对value_type 类型的对象的引用。

这些都在container中定义。

注意 std::map 被定义为一个容器。此信息是本文档的一部分。

https://en.cppreference.com/w/cpp/named_req/Container

【讨论】:

  • 该 cppreference 页面现已删除。
  • @GabrielStaples 已修复。
【解决方案2】:

所以,我的问题是,聪明的开发人员怎么会知道std::unordered_map&lt;K, V&gt;::iterator 实际代表什么?我确信我缺少一些逻辑上的飞跃。

截至几分钟前,此页面 (https://en.cppreference.com/w/cpp/container/unordered_map) 现在显示以下图片。

请注意我突出显示的部分。现在很清楚iterator 是“到value_type”,而const iterator 是“到const value_type”。而value_type 被指定为std::pair&lt;const Key, T&gt;。因此,取消引用一个交互器 (*my_iterator) 为您提供了一个类型为 value_type 的对象,在这种情况下为 std::pair&lt;const Key, T&gt;——对于 std::unordered_map。现在应该一切都清楚了。

参考资料:

我发现相关链接真的很有帮助,因为我研究了这个,按照从最有帮助到最没有帮助的顺序:

  1. [最优秀的文章]https://thispointer.com/how-to-iterate-over-an-unordered_map-in-c11/
  2. [关于迭代器的优秀一般信息]https://www.cplusplus.com/reference/iterator/
  3. [cplusplus.com std::unordered_map 参考 pg]https://www.cplusplus.com/reference/unordered_map/unordered_map/
  4. [cppreference.com std::unordered_map 参考 pg] https://en.cppreference.com/w/cpp/container/unordered_map

另见:

  1. How to use range-based for() loop with std::map?

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 2010-09-21
    • 2013-07-21
    • 2014-04-24
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多