无法打印存储在Iterator中的内容

时间:2013-06-11 07:31:33

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

// 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都会有错误。为什么我不能打印出来,所以我可以知道它们究竟会返回什么,或者什么将保留在interator得到了?

错误:

  

错误1错误C2679:二进制'&lt;&lt;' :找不到哪个运营商需要   'std :: _ List_iterator&lt; _Mylist&gt;'类型的右侧操作数(或者有   不可接受   转换)c:\ users \ chunhaun \ c ++ lessons \ self-learning \ self-learning \ associative_container.cpp 19

     

6智能感知:无操作员“&lt;&lt;”匹配这些   operands c:\ users \ chunhaun \ c ++ lessons \ self-learning \ self-learning \ associative_container.cpp 21

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

是的,因为您正在打印迭代器,它将无法工作。您可以先打印出已创建的地图的键/值对来进行一些调试。此外,您可能正在输入不在地图中的键值。您可以通过显示输入来验证这一点。这样您就可以更轻松地调试它。 要获得用户的输入,只需使用

cin >> input;