मानचित्र के माध्यम से C ++ लूप


216

मैं map<string, int>इसके किसी भी स्ट्रिंग-इंट मान या कुंजियों को जाने बिना प्रत्येक तत्व के माध्यम से पुनरावृति करना चाहता हूं ।

मेरे पास अब तक क्या है:

void output(map<string, int> table)
{
       map<string, int>::iterator it;
       for (it = table.begin(); it != table.end(); it++)
       {
            //How do I access each element?  
       }
}

जवाबों:


490

आप इसे निम्न प्रकार से प्राप्त कर सकते हैं:

map<string, int>::iterator it;

for ( it = symbolTable.begin(); it != symbolTable.end(); it++ )
{
    std::cout << it->first  // string (key)
              << ':'
              << it->second   // string's value 
              << std::endl ;
}

साथ सी ++ 11 (और बाद) ,

for (auto const& x : symbolTable)
{
    std::cout << x.first  // string (key)
              << ':' 
              << x.second // string's value 
              << std::endl ;
}

साथ सी ++ 17 (और बाद) ,

for( auto const& [key, val] : symbolTable )
{
    std::cout << key         // string (key)
              << ':'  
              << val        // string's value
              << std::endl ;
}

7
"ऑटो" प्रकार को "
इट

2
@ P0W C ++ 11 के लिए "ऑटो कास्ट" क्यों लेकिन C ++ 17 के लिए "कास्ट ऑटो और"? "ऑटो कास्ट &" और "कास्ट ऑटो" के बीच कोई अंतर?
एरिक

35
कोई फर्क नहीं है, यह सिर्फ स्वाद की बात है। हालांकि ऐसा लगता है कि @ P0W का स्वाद बहुत अधिक नहीं है ...
कपिचू

15
सी ++ 17 एक के साथ अद्यतन करने के लिए धन्यवाद, मैं auto const& [key, val] : symbolTableप्रारूप की तलाश कर रहा था !
पानी

3
@haram आपको प्रोजेक्ट सेटिंग्स (कॉन्फ़िगरेशन गुण> C / C ++> भाषा> C ++ भाषा मानक)
Swordfish

27

निम्नलिखित का प्रयास करें

for ( const auto &p : table )
{
   std::cout << p.first << '\t' << p.second << std::endl;
} 

वही लूप के लिए एक साधारण का उपयोग करके लिखा जा सकता है

for ( auto it = table.begin(); it != table.end(); ++it  )
{
   std::cout << it->first << '\t' << it->second << std::endl;
} 

ध्यान रखें कि value_type std::mapनिम्न तरीके से परिभाषित किया गया है

typedef pair<const Key, T> value_type

इस प्रकार मेरे उदाहरण में p एक मान है जो value_type है जहां Key है std::stringऔर T हैint

साथ ही यह बेहतर होगा कि फ़ंक्शन को घोषित किया जाएगा

void output( const map<string, int> &table );

14

value_typeएक के mapएक है pairकुंजी है और यह के रूप में मूल्य युक्त firstऔर secondसदस्य, क्रमशः।

map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first << ' ' << it->second << '\n';
}

या C ++ 11 के साथ, के लिए रेंज-आधारित का उपयोग कर:

for (auto const& p : symbolTable)
{
    std::cout << p.first << ' ' << p.second << '\n';
}

7

मास्को से @Vlad कहते हैं, को ध्यान में रखें कि value_typeके लिए std::mapनिम्नलिखित तरीके से परिभाषित किया गया है:

typedef pair<const Key, T> value_type

इसका मतलब यह है कि यदि आप कीवर्ड autoको अधिक स्पष्ट प्रकार के विनिर्देशक के साथ बदलना चाहते हैं , तो आप ऐसा कर सकते हैं;

for ( const pair<const string, int> &p : table ) {
   std::cout << p.first << '\t' << p.second << std::endl;
} 

बस समझने के लिए कि autoइस मामले में क्या अनुवाद होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.