2015-12-21 2 views
3

This answer в this popular question дает идиоматическое использование петли диапазонов для с картой:Почему C++ 11 для диапазона циклов не учитывает итерации карт?

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 
} 

и, ну, вы знаете - я не хочу, чтобы написать эти целые три линии, тем более, что я не забочусь о кВ (обычно). Я бы ожидать что-то вроде

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 
} 

или какой-либо другой аналогичной конструкции для работы. Если мы можем назначить пары, и если мы сможем строить пары при их установке на картах, почему бы не определить пары в цикле диапазона?

... или, может быть, у C++ 11/14/17 есть какой-то трюк для достижения такого эффекта?

+3

Вы можете быть заинтересованы в [P0144R0] (http://wg21.link/P0144R0). –

ответ

2

C++ 17 позволит Structured Bindings:

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

Умм, это использование двойной ссылки после авто, что-то новое для C++ 17? Кроме того, вы знаете, почему комитет выбрал квадратные скобки? (blech) – einpoklum

+0

Он уже существует в C++ 11 и называется rvalue-ссылками. Вы могли бы использовать 'const auto &' тоже, однако, auto && рухнул бы до соответствующего типа, делая его более общим. –

+0

Я знаю о ссылках rvalue, мне просто интересно, было ли у них какое-то особое значение w.r.t. структурированные привязки. – einpoklum

Смежные вопросы