【问题标题】:c++ - iterating through a map of 3 elementsc++ - 遍历 3 个元素的映射
【发布时间】:2017-03-19 15:45:04
【问题描述】:

我对在 C++ 中使用 STL 容器非常陌生。

我有一个包含 3 个元素的映射(2 个字符串作为一对 - 充当键,一个 int 充当值。)

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

但是当我尝试像这样迭代它时:

  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++) {

不确定我在这里做错了什么 - 不过这应该是一个简单的修复。

【问题讨论】:

  • 不应该是 map, int>::iterator i 吗? map, int> iterator i 没有意义......您一次声明了两个变量(iterator 和 i)
  • 在需要冒号的地方使用空格。
  • 谢谢大家!这解决了问题!
  • 但现在我有另一个问题:error: no match for ‘operator&lt;&lt;’ 在线:cout &lt;&lt; i-&gt;first &lt;&lt; " " &lt;&lt; i-&gt;second &lt;&lt; "\n"; 我认为这与原始问题无关。
  • @RockAndaHardPlace 因为i-&gt;first 是一对 .. 那么你将如何打印一对呢?看到这个stackoverflow.com/questions/19228994/…

标签: c++ syntax iterator scope-resolution


【解决方案1】:

您在迭代器之前忘记了 ::。
您也可以使用 auto 关键字:

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

或者简单地使用基于范围的for循环:

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

【讨论】:

  • 谢谢@Djerdjer!这解决了这个问题,但现在我有另一个问题:错误:不匹配'operatorfirst second
  • 您的程序中是否包含 标头?
  • 是的,包括在内。
  • 你在使用 std::string 吗? (或使用命名空间标准)
  • 啊我刚刚意识到你的地图键是一对,所以你需要打印一对 (cout first.first first.second 秒
【解决方案2】:
  1. 您输入错误(您使用空格而不是 ::)。

  2. Map 迭代器为您提供了一个键值对——而您的键是一对!所以你有一对作为成员的一对。这是一个大致完成您想要做的示例。

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

【讨论】:

  • 我这样做了:cout &lt;&lt; i.first.first &lt;&lt; " " &lt;&lt; i.first.second &lt;&lt; "\n" &lt;&lt; static_cast&lt;char&gt;(kv.second); 但它抛出了错误。另外,不确定我们为什么要使用:static_cast&lt;char&gt;(kv.second)
  • 如果您使用的是迭代器,请记住它们的作用类似于指针。所以你应该使用i-&gt;first.first 而不是i.first.first。此外,static_cast&lt;char&gt;(....) 很可爱——通过 C++11 编译器运行我的示例,看看随后的程序做了什么 =)。
  • 我在输出中得到一个带有二进制数字的奇怪字符,哈哈。
  • 您可能正在使用kv.second 而不是kv-&gt;second
  • 不,我认为这可能与 static_cast&lt;char&gt;(....) 有关...我用字符串本身得到了正确的输出,但还有额外的字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2012-05-14
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多