// 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
答案 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;