2016-11-06 61 views
1

我很新,在C++中使用STL容器。C++ - 遍歷3個元素的地圖

我有地圖3種元素 -

map<pair<string, string>, int> wordpairs; 

但是當我嘗試來遍歷它是這樣的(2個字符串作爲一對充當鍵,和一個int充當值。):

for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs.end(); i++) { 
     cout << i->first << " " << i->second << "\n"; 
    } 

編譯器引發錯誤:

 error: expected ‘;’ before ‘i’ 
     for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs. 
                ^
    error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive] 
    a7a.cpp:46:50: note: (if you use ‘-fpermissive’ G++ will accept your code) 

    error: cannot convert ‘std::map<std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int> >}’ to ‘int’ in assignment 
     for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs. 
                 ^
    error: no match for ‘operator!=’ (operand types are ‘int’ and ‘std::map<std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int> >}’) 
     for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs. 
                      ^ 

    error: expected ‘)’ before ‘;’ token 
    pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs.end(); i++) { 
                        ^
    error: expected ‘;’ before ‘)’ token 
    pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs.end(); i++) { 

不知道我在做什麼錯在這裏 - 這應該儘管是一個簡單的修復。

+1

不應它是地圖<對<字符串,字符串>,int>的:迭代I 12 map ,int> iterator我沒有意義...你一次聲明兩個變量(迭代器和i) – solti

+1

使用需要冒號的空格。 – Peter

+0

謝謝你們!這解決了問題! – RockAndaHardPlace

回答

3
  1. 你得到類型錯誤的(你用空格代替::) 。

  2. 地圖迭代器給你一個關鍵值對 - 而你的關鍵是一對!所以你有一對作爲一個成員。以下是一個大致可以實現你想要做的事情的例子。

    #include <iostream> 
    #include <map> 
    #include <string> 
    #include <utility> 
    using namespace std; 
    
    int main() { 
        pair<string, string> my_key("To", "Be"); 
        map<pair<string, string>, int> wordpairs { { {"Hello", "World"}, 33} }; 
        for (const auto& kv : wordpairs) { 
        cout << kv.first.first << ", " 
         << kv.first.second << static_cast<char>(kv.second); 
        } 
        return 0; 
    } 
    
+0

我做到了這一點:'cout << i。 first.first <<「」<< i.first.second <<「\ n」<< static_cast (kv.second);'但是它會拋出錯誤,並且不確定爲什麼我們要使用:'static_cast (KV。秒)' – RockAndaHardPlace

+1

如果您使用的是迭代器,請記住它們像指針一樣工作。所以應該使用'i-> first.first'而不是'i.first.first'。此外,'的static_cast (....)'是成爲可愛 - 通過C++編譯器11運行我的例子,看看接下來的程序在做什麼=)。 – druckermanly

+0

我得到一個奇怪的字符與輸出哈哈二進制數字。 – RockAndaHardPlace

2

你忘了::迭代器之前。
您還可以使用自動關鍵字:

for (auto i = wordpairs.begin(); i != wordpairs.end(); ++i) { 
    cout << i->first << " " << i->second << "\n"; 
} 

,或者乾脆利用範圍爲基礎的循環:

for (auto& i : wordpairs) { 
    cout << i->first << " " << i->second << "\n"; 
} 
+0

謝謝@Djerdjer!這解決了這個問題,但現在我有另一個問題:錯誤:不符合'operator <<'在行:cout << i->第一個<< " " << i->第二個<<「\ n」;;儘管如此,這與原來的問題無關。 – RockAndaHardPlace

+0

程序中是否包含標題? – Djerdjer

+0

是的,它包括在內。 – RockAndaHardPlace