【问题标题】:map auto-based loop single element access C++基于地图自动循环的单元素访问 C++
【发布时间】:2019-06-17 03:06:20
【问题描述】:

我试图理解除了auto 循环之外的“理论”

std::map

C++ 中的元素。 我有一个std::map,其中std::string 作为键,vector<std:string> 作为值。我可以通过以下方式访问其元素:

for ( auto &element : myMap ) {
    std::cout << element.first << ": " << '\t';
    for ( std::string subElement : element.second ) std::cout << subElement << ", ";
  }
}

至于vector&lt;string&gt; 元素的循环,我知道我可以使用“auto”而不是“std::string”。但是在这种情况下,地图的等价物是什么?我研究并四处搜索,我在that post 中发现每个地图元素都作为一个

地图::value_type

但是我该怎么写呢?我试过了:

for ( std::map<std::string, vector<std::string>> &pz : myMap ) {
    // print ...
}

和类似的,但它们只是不起作用。

【问题讨论】:

    标签: c++ c++11 dictionary stdmap auto


    【解决方案1】:

    std::map::value_type定义为std::map的元素类型,即std::pair&lt;const Key, T&gt;(即std::pair&lt;const std::string, vector&lt;std::string&gt;&gt;这里)。你应该把它当作

    for ( std::map<std::string, vector<std::string>>::value_type &pz : myMap ) {
        //                                          ^^^^^^^^^^^^
        // print ...
    }
    

    【讨论】:

    • 它就是这么直观......所以指示性地“::value_type”让 C++ 将其解释为访问子元素的“单个元素”?
    • @cccnrc 是的,std::map 的元素确实是std::pair。
    • @cccnrc std::map 是一张地图。 std::map::value_type 是std::map 类的成员类型,顾名思义,就是映射中某个值的类型。
    • @cccnrc 这有点令人困惑,因为 map 包含 key-value 对,但 value_type 不是存储 values 的类型,而是一种完整的条目(键值对)。值的类型拼写为mapped_type。
    • @UsingCpp For std::map&lt;std::string, vector&lt;std::string&gt;&gt;, typename 不是必需的;所有模板参数都已确定。
    【解决方案2】:

    songyuanyao已经回答了你的问题。 这里需要澄清的一件事是std::map 被定义为

    template<
        class Key,
        class T,
        class Compare = std::less<Key>,
        class Allocator = std::allocator<std::pair<const Key, T> >
    > class map;
    

    类名应该是std::map&lt;key type, value type&gt;。

    【讨论】:

    • 其实是std::map&lt;const key type, value type&gt;
    猜你喜欢
    • 2019-02-13
    • 2019-09-03
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2021-05-10
    • 2020-07-09
    相关资源
    最近更新 更多