Dla C++ 17 należy użyć structured binding declaration. Składnia jest obsługiwana w gcc-7 i clang-4.0 (clang live example). To pozwala nam rozpakować krotka tak:
for (auto [i, f] = std::tuple{1, 1.0}; i < N; ++i) { /* ... */ }
dla C++ 14 można zrobić to samo jak C++ 11 (poniżej) z dodatkiem opartym typu std::get
. Więc zamiast std::get<0>(t)
w poniższym przykładzie, możesz mieć std::get<int>(t)
.
dla C++ 11 std::make_pair
pozwala to zrobić, a także std::make_tuple
dla więcej niż dwóch przedmiotów.
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
zwróci dwa argumenty w std::pair
. Elementy są dostępne pod numerem .first
i .second
.
Od ponad dwóch obiektów, musisz użyć 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
jest o zmiennej liczbie argumentów szablonu, który wybuduje krotki dowolnej liczby argumentów (z pewnymi ograniczeniami technicznymi oczywiście). Elementy mogą być dostępne przez indeks z std::get<INDEX>(tuple_object)
wewnątrz ciał pętlowych można łatwo alias obiektów, choć nadal trzeba używać .first
lub std::get
dla dla stanu pętli i aktualizować wyraz
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
}
Dla C++ 98 i C++ 03 Można jawnie nazwać typy std::pair
. Nie ma standardowy sposób uogólniać to więcej niż dwóch rodzajów mimo:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
Jest to możliwe w g ++ - 4.4 ('-std = C++ 0x') w postaci' for (i = 0 auto , j = 0.0; ... ', ale ta możliwość została usunięta w g ++ - 4.5, aby pokryć się z tekstami C++ 0x. – rafak
możliwy duplikat [Czy mogę zadeklarować zmienne różnych typów w inicjalizacji pętli for?] (http://stackoverflow.com/questions/8644707/can-i-declare-variables-of-different-types-in--initialization-of-a-loop) –
W rzeczywistości to inne pytanie powinno zostać zamknięte jako duplikat tego, ponieważ ma to lepsze odpowiedzi: –