C++ 如何将基于范围的for()循环与std::map一起使用?

C++ 如何将基于范围的for()循环与std::map一起使用?,c++,c++11,for-loop,dictionary,C++,C++11,For Loop,Dictionary,C++11基于范围的for()循环的常见示例总是这样简单: std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout << xyz << std::endl; } 当遍历的容器很简单时,基于范围的for()循环似乎会为我们提供每个项,而不是迭代器。这很好…如果它是迭代器,我们必须做的第一件事就是取消对它的引用 但是当涉及到地图

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

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}
当遍历的容器很简单时,基于范围的for()循环似乎会为我们提供每个项,而不是迭代器。这很好…如果它是迭代器,我们必须做的第一件事就是取消对它的引用

但是当涉及到地图和多重地图时,我不知道该期待什么


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

容器的每个元素都是一个
map::value\u type
,它是
std::pair
typedef
。因此,在C++17或更高版本中,您可以编写

for (auto& [key, value]: myMap) {
    std::cout << key << " has value " << value << std::endl;
}

您也可以考虑标记<代码> kV变量<代码> const 如果您想要值的只读视图。

for(type specifier seq simple declarator:expression)语句

在语法上等同于

{
    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
    }
}
{
typedef decltype(表达式)C;
自动&rng(表达式);
for(自动开始(std::for::begin(rng)),end(std::for::end(rng));begin!=end;++begin){
类型说明顺序简单声明符(*begin);
陈述
}
}
因此,您可以清楚地看到,在您的情况下,
abc
将是
std::pair

因此,对于打印,您可以通过
abc.首先
abc.其次

访问每个元素。如果foo和bar的复制赋值运算符便宜(例如int、char、pointer等),您可以执行以下操作:

foo f; bar b;
BOOST_FOREACH(boost::tie(f,b),testing)
{
  cout << "Foo is " << f << " Bar is " << b;
}
std::map< foo, bar > testing = { /*...blah...*/ };
for ( const auto& [ k, v ] : testing )
{
  std::cout << k << "=" << v << "\n";
}
foof;b栏;
增压器(增压:连接(f,b),测试)
{

cout如果您只想查看地图中的键/值,并且喜欢使用boost,则可以将boost适配器与基于范围的循环一起使用:

for (const auto& value : myMap | boost::adaptors::map_values)
{
    std::cout << value << std::endl;
}
for(const auto&value:myMap | boost::adapters::map|u值)
{
std::cout在C++17中,这被称为,它允许以下操作:

foo f; bar b;
BOOST_FOREACH(boost::tie(f,b),testing)
{
  cout << "Foo is " << f << " Bar is " << b;
}
std::map< foo, bar > testing = { /*...blah...*/ };
for ( const auto& [ k, v ] : testing )
{
  std::cout << k << "=" << v << "\n";
}
std::maptesting={/*…blah…*/};
用于(常数自动和[k,v]:测试)
{

std::cout语句的范围与标准库
std::begin
std::end
函数或同名的成员函数发生了邪恶的共舞。@will在一个三行示例中,您发现了假变量名?第一段代码没有使用“C++11基于范围的for()”。这不是问题的答案“C++11:如何将基于范围的for()循环与std::map一起使用?”@ytj答案中已经提到它不起作用。我不想删除它,这样新用户就不必再次尝试并找出事实。是否可以将
const&
作为键的引用,而将非const引用作为该值的引用?(因为这就是map::value_type所做的…@peterchen:
k
const
如果您使用
进行(自动和[k,v]:测试)
cppreference on structured bindings如果您使用GCC编译,您需要7版或更高版本的结构化绑定:我发现相关链接非常有用,正如我研究过的,按从最有用到最不有用的顺序排列:1)[最优秀的文章],2)[关于迭代器的优秀一般信息],3)[cplusplus.com
std::无序地图
reference pg],4[cppreference.com
std::无序地图
reference pg],5)另见。
std::map< foo, bar > testing = { /*...blah...*/ };
for ( const auto& [ k, v ] : testing )
{
  std::cout << k << "=" << v << "\n";
}