C ++ 17 : Tak! Należy użyć ustrukturyzowanej wiążącej deklaracji . Składnia jest obsługiwana w gcc i clang od lat (od gcc-7 i clang-4.0) ( przykład na żywo clang ). To pozwala nam rozpakować krotkę w następujący sposób:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"ab"}}; i < N; ++i, f += 1.5) {
// ...
}
Powyższe daje ci:
int i
Ustawić 1
double f
Ustawić 1.0
std::string s
Ustawić "ab"
Upewnij się, że #include <tuple>
dla tego rodzaju deklaracji.
Możesz podać dokładne typy wewnątrz tuple
, wpisując je wszystkie tak jak ja std::string
, jeśli chcesz nazwać typ. Na przykład:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
Specyficznym zastosowaniem tego jest iteracja po mapie, uzyskanie klucza i wartości,
std::unordered_map<K, V> m = { /*...*/ };
for (auto& [key, value] : m) {
// ...
}
Zobacz przykład na żywo tutaj
C ++ 14 : Możesz zrobić to samo co C ++ 11 (poniżej) z dodatkiem opartego na typie std::get
. Zamiast tego std::get<0>(t)
w poniższym przykładzie możesz mieć std::get<int>(t)
.
C ++ 11 : std::make_pair
pozwala to zrobić, a także std::make_tuple
dla więcej niż dwóch obiektó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
. Dostęp do elementów można uzyskać za pomocą .first
i .second
.
W przypadku więcej niż 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
to szablon variadic, który zbuduje krotkę dowolnej liczby argumentów (oczywiście z pewnymi ograniczeniami technicznymi). Dostęp do elementów można uzyskać za pomocą indeksu za pomocąstd::get<INDEX>(tuple_object)
W obiektach pętli for można łatwo aliasować obiekty, choć nadal trzeba użyć .first
lub std::get
dla warunku pętli for i zaktualizować wyrażenie
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 i C ++ 03 Możesz jawnie nazwać typy a std::pair
. Nie ma jednak standardowego sposobu na uogólnienie tego na więcej niż dwa typy:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
-std=c++0x
) w formiefor(auto i=0, j=0.0; ...
, ale ta możliwość została usunięta w g ++ - 4.5, aby pokrywać się z tekstami c ++ 0x.