1
// 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:二进制“<<”:未找到采用“std::_List_iterator<_Mylist>”类型右侧操作数的运算符(或没有可接受的转换)c:\users\chunhaun\c++课程\自学\自学\associative_container.cpp 19

6 IntelliSense:没有运算符“<<”与这些操作数匹配 c:\users\chunhaun\c++lessons\self-learning\self-learning\associative_container.cpp 21

4

3 回答 3

1

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

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

于 2013-06-11T07:48:54.323 回答
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;
}
于 2013-06-11T07:49:07.813 回答
0

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

cin >> input;
于 2013-06-11T07:49:47.213 回答