C ++ 17 : ¡Sí! Debe usar una declaración vinculante estructurada . La sintaxis ha sido compatible con gcc y clang durante años (desde gcc-7 y clang-4.0) ( ejemplo de clang live ). Esto nos permite descomprimir una tupla así:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"ab"}}; i < N; ++i, f += 1.5) {
// ...
}
Lo anterior te dará:
int i
ajustado a 1
double f
ajustado a 1.0
std::string s
ajustado a "ab"
Asegúrese de que #include <tuple>
para este tipo de declaración.
Puede especificar los tipos exactos dentro tuple
de, escribiéndolos todos como tengo con el std::string
, si desea nombrar un tipo. Por ejemplo:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
Una aplicación específica de esto es iterar sobre un mapa, obtener la clave y el valor,
std::unordered_map<K, V> m = { /*...*/ };
for (auto& [key, value] : m) {
// ...
}
Vea un ejemplo en vivo aquí
C ++ 14 : puede hacer lo mismo que C ++ 11 (a continuación) con la adición de tipo basado std::get
. Entonces, en lugar del std::get<0>(t)
ejemplo a continuación, puede tener std::get<int>(t)
.
C ++ 11 : le std::make_pair
permite hacer esto, así como std::make_tuple
para más de dos objetos.
for (auto p = std::make_pair(5, std::string("Hello World")); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
std::make_pair
devolverá los dos argumentos en a std::pair
. Se puede acceder a los elementos con .first
y .second
.
Para más de dos objetos, deberá usar un std::tuple
for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{});
std::get<0>(t) < 10;
++std::get<0>(t)) {
std::cout << std::get<1>(t) << std::endl; // cout Hello world
std::get<2>(t).push_back(std::get<0>(t)); // add counter value to the vector
}
std::make_tuple
es una plantilla variada que construirá una tupla de cualquier número de argumentos (con algunas limitaciones técnicas, por supuesto). Se puede acceder a los elementos por índice constd::get<INDEX>(tuple_object)
Dentro de los cuerpos del bucle for puede alias fácilmente los objetos, aunque todavía necesita usar .first
o std::get
para la condición del bucle for y actualizar la expresión
for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{});
std::get<0>(t) < 10;
++std::get<0>(t)) {
auto& i = std::get<0>(t);
auto& s = std::get<1>(t);
auto& v = std::get<2>(t);
std::cout << s << std::endl; // cout Hello world
v.push_back(i); // add counter value to the vector
}
C ++ 98 y C ++ 03 Puede nombrar explícitamente los tipos de a std::pair
. Sin embargo, no hay una forma estándar de generalizar esto a más de dos tipos:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
-std=c++0x
) en forma defor(auto i=0, j=0.0; ...
, pero esta posibilidad se eliminó en g ++ - 4.5 para coincidir con los textos de c ++ 0x.