C ++ 17 : Ja! Sie sollten eine strukturierte Bindungsdeklaration verwenden . Die Syntax wird seit Jahren in gcc und clang unterstützt (seit gcc-7 und clang-4.0) ( Beispiel für clang live ). Dies ermöglicht es uns, ein Tupel wie folgt auszupacken:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"ab"}}; i < N; ++i, f += 1.5) {
// ...
}
Das Obige gibt Ihnen:
int i
einstellen 1
double f
einstellen 1.0
std::string s
einstellen "ab"
Stellen Sie sicher, #include <tuple>
für diese Art von Erklärung.
Sie können die genauen Typen innerhalb tuple
von angeben, indem Sie sie alle wie bei der eingeben std::string
, wenn Sie einen Typ benennen möchten. Beispielsweise:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
Eine spezielle Anwendung davon ist das Durchlaufen einer Karte, um den Schlüssel und den Wert zu erhalten.
std::unordered_map<K, V> m = { /*...*/ };
for (auto& [key, value] : m) {
// ...
}
Sehen Sie ein Live - Beispiel hier
C ++ 14 : Sie können dasselbe wie C ++ 11 (unten) tun, indem Sie typbasiert hinzufügen std::get
. Anstelle des std::get<0>(t)
folgenden Beispiels können Sie also haben std::get<int>(t)
.
C ++ 11 : std::make_pair
Ermöglicht dies sowie std::make_tuple
für mehr als zwei Objekte.
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
gibt die beiden Argumente in a zurück std::pair
. Auf die Elemente kann mit .first
und zugegriffen werden .second
.
Für mehr als zwei Objekte müssen Sie a verwenden 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
ist eine variable Vorlage, die ein Tupel mit einer beliebigen Anzahl von Argumenten erstellt (natürlich mit einigen technischen Einschränkungen). Auf die Elemente kann per Index mit zugegriffen werdenstd::get<INDEX>(tuple_object)
Innerhalb der for - Schleife Körper können Sie einfach alias die Objekte, obwohl Sie noch brauchen , um den Einsatz .first
oder std::get
für die for - Schleife Zustand und Aktualisierungsausdruck
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 und C ++ 03 Sie können die Typen von a explizit benennen std::pair
. Es gibt jedoch keine Standardmethode, um dies auf mehr als zwei Typen zu verallgemeinern:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
-std=c++0x
) in Form von möglichfor(auto i=0, j=0.0; ...
, aber diese Möglichkeit wurde in g ++ - 4.5 entfernt, um mit den c ++ 0x-Texten übereinzustimmen.