为了账号安全,请及时绑定邮箱和手机立即绑定

如何在std :: map中使用基于范围的for()循环?

如何在std :: map中使用基于范围的for()循环?

C++
蛊毒传说 2019-11-21 15:10:18
C ++ 11基于范围的for()循环的常见示例总是像这样简单: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?}当遍历的容器很简单时,基于范围的for()循环将为我们提供每个项,而不是迭代器。很好...如果它是迭代器,那么我们总是要做的第一件事就是反引用它。但是,对于诸如地图和多图之类的东西,我感到困惑。(我仍然在g ++ 4.4上,而基于范围的循环在g ++ 4.6+中,所以我还没有机会尝试它。)
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

容器的每个元素都是a map<K, V>::value_type,这是typedeffor std::pair<const K, V>。因此,在C ++ 17或更高版本中,您可以编写


for (auto& [key, value]: myMap) {

    std::cout << key << " has value " << value << std::endl;

}

或作为


for (const auto& [key, value]: myMap) {

    std::cout << key << " has value " << value << std::endl;

}

如果您不打算修改值。


在C ++ 11和C ++ 14中,可以使用增强的for循环自行提取每对,然后手动提取键和值:


for (const auto& kv : myMap) {

    std::cout << kv.first << " has value " << kv.second << std::endl;

}

如果您需要值的只读视图,也可以考虑标记kv变量const。


查看完整回答
反对 回复 2019-11-21
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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


std::map< foo, bar > testing = { /*...blah...*/ };

for ( const auto& [ k, v ] : testing )

{

  std::cout << k << "=" << v << "\n";

}


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 1170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信