C ++ 17 : Ya! Anda harus menggunakan deklarasi mengikat terstruktur . Sintaks telah didukung dalam gcc dan dentang selama bertahun-tahun (sejak gcc-7 dan dentang-4.0) ( contoh dentang hidup ). Ini memungkinkan kita untuk membongkar tuple seperti:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"ab"}}; i < N; ++i, f += 1.5) {
// ...
}
Di atas akan memberi Anda:
int i
mulai 1
double f
mulai 1.0
std::string s
mulai "ab"
Pastikan #include <tuple>
untuk deklarasi semacam ini.
Anda dapat menentukan jenis persis di dalam tuple
dengan mengetik semuanya seperti yang saya miliki dengan std::string
, jika Anda ingin memberi nama jenis. Sebagai contoh:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
Aplikasi spesifik ini adalah iterasi di atas peta, mendapatkan kunci dan nilai,
std::unordered_map<K, V> m = { /*...*/ };
for (auto& [key, value] : m) {
// ...
}
Lihat contoh langsung di sini
C ++ 14 : Anda dapat melakukan hal yang sama seperti C ++ 11 (di bawah) dengan penambahan berbasis tipe std::get
. Jadi alih-alih std::get<0>(t)
dalam contoh di bawah ini, Anda bisa memilikinya std::get<int>(t)
.
C ++ 11 : std::make_pair
memungkinkan Anda melakukan ini, juga std::make_tuple
untuk lebih dari dua objek.
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
akan mengembalikan dua argumen dalam std::pair
. Elemen-elemen dapat diakses dengan .first
dan .second
.
Untuk lebih dari dua objek, Anda harus menggunakan a 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
adalah templat variadic yang akan membuat tuple dari sejumlah argumen (dengan beberapa batasan teknis tentunya). Elemen-elemen dapat diakses dengan indeks denganstd::get<INDEX>(tuple_object)
Di dalam for loop body Anda dapat dengan mudah alias objek, meskipun Anda masih perlu menggunakan .first
atau std::get
untuk kondisi loop dan memperbarui ekspresi
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 dan C ++ 03 Anda dapat secara eksplisit memberi nama jenis a std::pair
. Tidak ada cara standar untuk menggeneralisasi ini ke lebih dari dua jenis:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
-std=c++0x
) dalam bentukfor(auto i=0, j=0.0; ...
, tetapi kemungkinan ini dihapus dalam g ++ - 4.5 untuk bertepatan dengan teks c ++ 0x.