【问题标题】:How come C++11's ranged for loop has no allowance for iterating maps?为什么 C++11 循环范围不允许迭代映射?
【发布时间】:2015-12-21 23:24:26
【问题描述】:

This answerthis popular question 给出了带有映射的 range-for 循环的惯用用法:

for (auto& kv : myMap) {
    // do stuff, where kv.first is the key and kv.second is the value
}

问题是,通常情况下,我们希望为键和值指定有意义的名称(而不是为它们对命名)。这意味着写作,例如:

for (auto& kv : myMap) {
    auto planet_name = kv.first;
    auto distance_from_sun = kv.second;
    // do stuff with planet_name and distance_from_sun
}

而且,好吧,你知道 - 我不想写完整的三行,特别是因为我不关心 kv(通常)。我希望像

for (auto& {planet_name, distance_from_sun} : myMap) {
    // do stuff with planet_name and planet_distance_from_sun
}

for (tie{auto& planet_name,auto& distance_from_sun} : myMap) {
    // do stuff with planet_name and planet_distance_from_sun
}

或其他一些类似的结构可以工作。如果我们可以分配对,并且如果我们可以在将它们放置在地图中时构造对,那么为什么不能在范围 for 循环中定义对呢?

...或者也许 C++11/14/17 确实有某种技巧可以以某种方式实现这种效果?

【问题讨论】:

标签: c++11 for-loop dictionary foreach range


【解决方案1】:

C++17 将允许Structured Bindings:

for (auto&& [planet_name, distance_from_sun] : myMap) {
    // do stuff
}

【讨论】:

  • 嗯,在自动之后使用双重引用是 C++17 的新功能吗?另外,你知道委员会为什么选择方括号吗? (漂白)
  • c++11 中已经存在,称为右值引用。你也可以使用const auto&,但是,auto&& 会折叠到适当的类型,使其更通用..
  • 我知道右值引用,我只是想知道它们是否有一些特殊的意义 w.r.t.结构化绑定。
  • 不一定。你可以像往常一样做,例如非引用(复制)、const 和非 const 引用等。在这种情况下使用右值引用只是最简洁的(我认为是最通用的)写下来的方法。当然,一如既往地谨慎使用它。
  • 好吧,我从来没有在 ranged for 循环中使用过 &&,this answer 建议我们可能不应该这样做,除非真的有必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2015-04-30
  • 2021-09-07
相关资源
最近更新 更多