std :: map :: find不起作用

时间:2013-07-19 08:16:03

标签: c++ visual-c++ stl

我正在尝试将信息保存在std::map中。但我对find

有疑问
typedef map<string, string, equal_to<string>> MAP_STRING2STRING;
....
MAP_STRING2STRING map;
MAP_STRING2STRING::const_iterator iter;

当我尝试查找key时,出现以下错误:

iter = map.find(key);

Error from Visual C++
我做错了什么?
只有在map中有内容时才会出现此错误。

2 个答案:

答案 0 :(得分:9)

你的地图有一种错误的比较函子。您需要strict weak ordering(小于或大于类型比较),而不是相等。您可以省略比较仿函数参数,并使用std::string的小于比较。这通过字符串的字典比较来实现严格的弱排序:

typedef map<string, string> MAP_STRING2STRING;

这相当于

typedef map<string, string, less<string> > MAP_STRING2STRING;

在内部,地图使用严格的弱排序比较来命令自己,并确定两个键是否相等。

第三个模板参数允许您使用自定义排序条件实例化地图。例如,这将创建一个具有上述反向排序的地图:

typedef map<string, string, greater<string> > MAP_STRING2STRING;

答案 1 :(得分:1)

如果您需要从std::stringstd::string的简单地图,只需使用map<string, string>(删除equal_to<string>虚假“比较器”)。

此外,由于您有一个名为“map”的变量,这可能会导致与STL map类冲突。更改变量名称(例如,将其称为myMap),或使用std::名称空间前缀std::map类:

typedef map<string, string> MAP_STRING2STRING;
....
MAP_STRING2STRING myMap;

此外,由于您使用VS2010的错误消息,您可以使用方便的auto C ++ 11关键字,以避免MAP_STRING2STRING::const_iterator的“混乱”,只需使用:< / p>

auto iter = myMap.find(someKey);