2014-10-09 10 views
42

मैं 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? 
     } 
} 
+2

संभावित डुप्लिकेट [सी ++ मानचित्र के माध्यम से लूप कैसे करें] (http: // stackoverflow।कॉम/प्रश्न/4844886/कैसे-टू-लूप-थ्रू-एसी-मैप) – amanuel2

उत्तर

117

आपको निम्न रूप इस लक्ष्य को हासिल कर सकते हैं:

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 ; 
} 
+3

"ऑटो" प्रकार को "इसे" – iedoc

+0

@ पी 0 डब्ल्यू के सामने जोड़ें "सी ++ 11 के लिए" ऑटो कॉन्स्ट एंड "क्यों है लेकिन" कॉन्स ऑटो " सी ++ 17? "ऑटो कॉन्स्ट एंड" और "कॉन्स ऑटो" के बीच कोई अंतर? – Eric

+1

कोई फर्क नहीं पड़ता, यह सिर्फ स्वाद का मामला है। हालांकि ऐसा लगता है कि @ पी 0 डब्ल्यू का स्वाद बहुत ही सुसंगत नहीं है ... – Kapichu

8

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

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

या साथ सी ++ 11, का उपयोग कर सीमा के आधार पर के लिए:

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

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

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; 
} 

ध्यान में रखें कि v std::map के लिए alue_type पी VALUE_TYPE जहां कुंजी std::string है करने के लिए एक स्थिरांक संदर्भ है मेरी उदाहरण में

typedef pair<const Key, T> value_type 

इस प्रकार नीचे दिए तरीक़े परिभाषित किया गया है और टी int

इसके अलावा यह बेहतर होगा है समारोह घोषित किया जाएगा अगर

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

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

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 इस मामले में करने के लिए अनुवाद कर देगा के लिए।

संबंधित मुद्दे