2016-11-06 62 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