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 tuple
bằ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_pair
cho phép bạn làm điều này, cũng như std::make_tuple
cho 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_pair
sẽ trả về hai đối số trong a std::pair
. Các yếu tố có thể được truy cập với .first
và .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_tuple
là 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 .first
hoặc std::get
cho đ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.