Я хотел бы перебрать массив временных пар (с указанием как можно меньшего количества типов)
for (const auto [x, y] : {{1, 1.0}, {2, 1.1}, {3, 1.2}}) {
// ...
}
Это возможно? (Я могу использовать любой стандарт С++, реализованный в gcc 11.2)
В настоящее время я использую обходной путь, используя map
s, который довольно многословен.
for (const auto [x, y] : std::map<int, double>{{1, 1.0}, {2, 1.1}, {3, 1.2}}) {
// ...
}
@Borgleader «Я предполагаю, что вы хотите избежать указания типов?» Да, я уточнил свой вопрос.
В качестве минимального решения вы можете перебрать std::initializer_list
из std::pair
, явно сделав хотя бы один элемент списка инициализаторов std::pair
:
for (const auto [x, y] : {std::pair{1, 1.0}, {2, 1.1}, {3, 1.2}}) {
// ...
}
Демо на божественной стреле.
std::map
выполняет выделение кучи, что немного расточительно. std::initializer_list<std::pair<int, double>>
лучше в этом плане, но более многословно.
Немного более разумная альтернатива:
for (const auto [x, y] : {std::pair{1, 1.0}, {2, 1.1}, {3, 1.2}})
Обратите внимание, что в этом случае тип первого элемента определяет типы остальных элементов. Например. если вы сделаете {std::pair{1, 2}, {3.1, 4.1}}
, последняя пара станет {3,4}
, так как первая использует int
s.
Я предполагаю, что вы хотите избежать указания типов? Потому что
for (const auto [x, y] : std::initializer_list<std::pair<int,double>>{{1, 1.0}, {2, 1.1}, {3, 1.2}}) {
, кажется, делает это.