【问题标题】:Failed to print what is stored in Iterator无法打印迭代器中存储的内容
【发布时间】:2013-06-06 23:39:01
【问题描述】:
// unordered_map::find
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main ()
{
  std::unordered_map<std::string,double> mymap;
  mymap["mom"] = 5.4;
  mymap["dad"] = 6.1;
  mymap["bro"] = 5.9;

  std::string input;
  std::cout << "who? ";
  getline (std::cin,input);

  std::unordered_map<std::string,double>::const_iterator got = mymap.find (input);

**cout << mymap.find(input) <<endl;
cout << got <<endl;
cout << mymap.end() <<endl;**


  if ( got == mymap.end() )
    std::cout << "not found";
  else
    std::cout << got->first << " is " << got->second;

  std::cout << std::endl;

  return 0;
}

为什么当我尝试打印得到的迭代器时,mymap.find 和 mymap.end 会发生错误。为什么我不能将它们打印出来,这样我就可以知道它们实际上会返回什么或将保留在插入器有吗?

错误:

错误 1 ​​错误 C2679: 二进制 '' 类型的右手操作数(或者有 不可接受 转换)c:\users\chunhaun\c++lessons\self-learning\self-learning\associative_container.cpp 19

6 IntelliSense:没有运算符“

【问题讨论】:

  • @C.Lang:嗨,我确实放了()。如上图。
  • 您是否为自己的问题和 cmets 投票?
  • @ViteFalcon:你不能为自己的东西投票。我赞成评论,因为他正确地编辑了代码。
  • @C.Lang:我只会赞成 cmets 或为讨论增加价值的答案。在这里,他确实对其进行了编辑,但我不明白为什么要赞成修复他的帖子中的错误。无论如何,这是个人喜好:)

标签: c++ hashmap hashtable associative-array unordered-map


【解决方案1】:

您无法打印迭代器,因为没有将迭代器的内容打印到std::ostream 的功能。与cout&lt;&lt;mymap.find&lt;&lt;endl; 相同,它试图编写我相信的函数指针。您需要做的是创建一个类似this 的函数。

重要提示:我展示的运算符重载函数在尝试打印无效迭代器时会抛出异常。 这只是为了演示如何解决“现实世界”问题的错误。显示迭代器内容的正确方法是您在程序结束时已经完成的操作。

【讨论】:

    【解决方案2】:

    因为您尝试打印的不是迭代器中存储的内容,而是迭代器本身。没有定义operator&lt;&lt; 来打印出各种迭代器——它们会打印什么?如果您愿意,可以自己定义一个:

    std::ostream& operator<<
    (std::ostream& out, const std::unordered_map<std::string, double>::const_iterator& iter)
    {
        typedef std::unordered_map<std::string, double>::const_iterator c_iterator;
        out << it->first << " with " << it->second << "\n"
        return out;
    }
    

    【讨论】:

    • 我也会在我的回答中提出同样的警告。当取消引用无效的迭代器时,这将抛出异常。
    • @ViteFalcon 当然,在使用它之前仍然需要检查end()。取消引用 end 会导致未定义的行为,但这是不言而喻的。
    • 但是由于地图不是运营商的一部分,因此无法进行该检查。
    • @Yuushi:我还在学习。我从来没有学过像“std::ostream& operator
    • @JadenNg 这被称为“操作符重载”。当你调用类似std::cout &lt;&lt; value(为简单起见,让value 的类型为int)时,实际调用的是std::ostream&amp; operator&lt;&lt;(std::ostream&amp; o, const int i)
    【解决方案3】:

    是的,当您打印迭代器时它不会工作。您可以通过首先打印出您创建的映射的键/值对来进行一些调试。此外,您可能会输入不在地图中的键值。您可以通过显示您的输入来验证这一点。这样,您将能够更轻松地对其进行调试。 要从用户那里获取输入,只需使用

    cin >> input;
    

    【讨论】:

    • 您阅读帖子中的错误了吗?它清楚地说明了问题所在。
    • 在我发布答案时进行了编辑,是的,简单地打印迭代器是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多