C ++ 17 : हाँ! आपको एक संरचित बाध्यकारी घोषणा का उपयोग करना चाहिए । सिंटैक्स को gcc और clang में वर्षों से समर्थित किया गया है (चूंकि gcc-7 और clang-4.0) ( clang live example )। यह हमें एक ट्यूपल को अनपैक करने की अनुमति देता है:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"ab"}}; i < N; ++i, f += 1.5) {
// ...
}
ऊपर आप देंगे:
int i
करने के लिए सेट 1
double f
करने के लिए सेट 1.0
std::string s
करने के लिए सेट "ab"
#include <tuple>
इस तरह की घोषणा के लिए सुनिश्चित करें ।
यदि आप एक प्रकार का नाम देना चाहते हैं, तो आप tuple
उन सभी प्रकारों को अंदर टाइप करके निर्दिष्ट कर सकते हैं जो मेरे पास std::string
हैं। उदाहरण के लिए:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
इसका एक विशिष्ट अनुप्रयोग एक नक्शे पर चलना, कुंजी और मूल्य प्राप्त करना है,
std::unordered_map<K, V> m = { /*...*/ };
for (auto& [key, value] : m) {
// ...
}
एक जीवंत उदाहरण यहां देखें
C ++ 14 : आप टाइप-आधारित के अलावा C ++ 11 (नीचे) के समान कर सकते हैं std::get
। इसलिए std::get<0>(t)
नीचे के उदाहरण में, आप कर सकते हैं std::get<int>(t)
।
सी ++ 11 : std::make_pair
आपको ऐसा करने की अनुमति देता है, साथ ही साथ std::make_tuple
दो से अधिक वस्तुओं के लिए भी।
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
में दो तर्कों को वापस करेगा std::pair
। तत्वों के साथ .first
और पहुँचा जा सकता है .second
।
दो से अधिक वस्तुओं के लिए, आपको एक का उपयोग करने की आवश्यकता होगी 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
एक वैरिएड टेम्प्लेट है जो किसी भी संख्या में तर्कों (पाठ्यक्रम की कुछ तकनीकी सीमाओं के साथ) का निर्माण करेगा। तत्वों को अनुक्रमणिका द्वारा पहुँचा जा सकता हैstd::get<INDEX>(tuple_object)
पाश के लिए शरीर के भीतर आप आसानी से वस्तुओं उर्फ, आप अभी भी उपयोग करने की जरूरत है, हालांकि .first
या std::get
पाश हालत और अद्यतन अभिव्यक्ति के लिए के लिए
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 और C ++ 03 आप स्पष्ट रूप से ए के प्रकारों का नाम दे सकते हैं std::pair
। यद्यपि इसे दो से अधिक प्रकारों के लिए सामान्यीकृत करने का कोई मानक तरीका नहीं है:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
-std=c++0x
) के रूप में संभव हैfor(auto i=0, j=0.0; ...
, लेकिन c ++ 0x ग्रंथों के साथ मेल खाने के लिए g ++ - 4.5 में इस संभावना को हटा दिया गया था।