基于()循环与std :: map?

()循环的C ++ 11基于范围的常见示例总是如此简单:

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}

在这种情况下, xyz是一个int 。 但是,当我们有像地图一样的东西时会发生什么? 这个例子中变量的类型是什么:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
    std::cout << abc << std::endl;         // ? should this give a foo? a bar?
    std::cout << abc->first << std::endl;  // ? or is abc an iterator?
}

当被遍历的容器是简单的,它看起来像基于范围的()循环会给我们每个项目,而不是迭代器。 这很好......如果它是迭代器,我们首先要做的第一件事就是解除引用它。

但是我很困惑,当涉及到地图和multimaps等事情时会发生什么。

(我仍然使用g ++ 4.4,而基于范围的循环使用g ++ 4.6+,所以我还没有机会尝试它。)


容器的每个元素都是一个map<K, V>::value_type ,它是std::pair<const K, V>typedef 。 因此,你可以这样写

for (auto& kv : myMap) {
    std::cout << kv.first << " has value " << kv.second << std::endl;
}

为了提高效率,最好将循环中的参数作为参考。 如果您想要只读值的视图,您也可以考虑将其const


在C ++ 17中,这被称为结构化绑定,它允许以下内容:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( const auto& [ k, v ] : testing )
{
  std::cout << k << "=" << v << "n";
}

从这篇论文中:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf

for( type-specifier-seq simple-declarator : expression ) statement

在语法上等同于

{
    typedef decltype(expression) C;
    auto&& rng(expression);
    for (auto begin(std::For<C>::begin(rng)), end(std::For<C>::end(rng)); begin != end; ++ begin) {
        type-specifier-seq simple-declarator(*begin);
        statement
    }
}

所以你可以清楚地看到,在你的情况下, abcstd::pair<key_type, value_type > 。 因此,对于打印,您可以通过abc.firstabc.second访问每个元素

链接地址: http://www.djcxy.com/p/60513.html

上一篇: based for() loop with std::map?

下一篇: Initializing a static std::map<int, int> in C++