C ++ 17 : Vâng! Bạn nên sử dụng một tuyên bố ràng buộc có cấu trúc . Cú pháp đã được hỗ trợ trong gcc và clang trong nhiều năm (kể từ gcc-7 và clang-4.0) ( ví dụ trực tiếp về tiếng kêu ). Điều này cho phép chúng tôi giải nén một tuple như vậy:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"ab"}}; i < N; ++i, f += 1.5) {
// ...
}
Ở trên sẽ cung cấp cho bạn:
int i đặt thành 1
double f đặt thành 1.0
std::string s đặt thành "ab"
Hãy chắc chắn để #include <tuple>loại khai báo này.
Bạn có thể chỉ định các loại chính xác bên trong tuplebằng cách nhập tất cả các loại như tôi có std::string, nếu bạn muốn đặt tên cho một loại. Ví dụ:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
Một ứng dụng cụ thể của điều này là lặp lại trên bản đồ, lấy khóa và giá trị,
std::unordered_map<K, V> m = { /*...*/ };
for (auto& [key, value] : m) {
// ...
}
Xem ví dụ trực tiếp tại đây
C ++ 14 : Bạn có thể làm tương tự như C ++ 11 (bên dưới) với việc bổ sung dựa trên kiểu std::get. Vì vậy, thay vì std::get<0>(t)trong ví dụ dưới đây, bạn có thể có std::get<int>(t).
C ++ 11 : std::make_paircho phép bạn làm điều này, cũng như std::make_tuplecho nhiều hơn hai đối tượng.
for (auto p = std::make_pair(5, std::string("Hello World")); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
std::make_pairsẽ trả về hai đối số trong a std::pair. Các yếu tố có thể được truy cập với .firstvà .second.
Đối với nhiều hơn hai đối tượng, bạn sẽ cần sử dụng một 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_tuplelà một khuôn mẫu có tính đột biến sẽ tạo ra một tuple của bất kỳ số lượng đối số nào (với một số hạn chế về kỹ thuật). Các yếu tố có thể được truy cập bởi chỉ mục vớistd::get<INDEX>(tuple_object)
Trong các thân vòng lặp for, bạn có thể dễ dàng đặt bí danh cho các đối tượng, mặc dù bạn vẫn cần sử dụng .firsthoặc std::getcho điều kiện vòng lặp for và biểu thức cập nhật
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 và C ++ 03 Bạn có thể đặt tên rõ ràng cho các loại a std::pair. Không có cách tiêu chuẩn để khái quát hóa điều này thành nhiều hơn hai loại:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
-std=c++0x) ở dạngfor(auto i=0, j=0.0; ..., nhưng khả năng này đã bị loại bỏ trong g ++ - 4.5 trùng với các văn bản c ++ 0x.