C++ std::map::find不';行不通
我试图将信息保存在C++ std::map::find不';行不通,c++,visual-c++,stl,C++,Visual C++,Stl,我试图将信息保存在std::map中。但是我在查找时遇到了一个问题: typedef map<string, string, equal_to<string>> MAP_STRING2STRING; .... MAP_STRING2STRING map; MAP_STRING2STRING::const_iterator iter; 我做错了什么? 只有当我在map中有某些内容时,才会出现此错误。您的map的比较函子类型错误。您需要(小于或大于类型比较),而不是相等。
std::map
中。但是我在查找时遇到了一个问题:
typedef map<string, string, equal_to<string>> MAP_STRING2STRING;
....
MAP_STRING2STRING map;
MAP_STRING2STRING::const_iterator iter;
我做错了什么?
只有当我在
map
中有某些内容时,才会出现此错误。您的map的比较函子类型错误。您需要(小于或大于类型比较),而不是相等。您可以省略comparison functor参数,并对std::string
使用小于比较。这通过对字符串的字典比较实现严格的弱排序:
typedef map<string, string> MAP_STRING2STRING;
typedef map\u string2字符串;
这相当于
typedef map<string, string, less<string> > MAP_STRING2STRING;
typedef map\u string2字符串;
在内部,映射对两个顺序本身使用严格的弱顺序比较,并确定两个键是否相等
第三个模板参数允许您使用自定义排序条件实例化映射。例如,这将创建一个与上面顺序相反的映射:
typedef map<string, string, greater<string> > MAP_STRING2STRING;
typedef map\u string2字符串;
如果您想要一个从std::string
到std::string
的简单映射,只需使用map
(将equal_放入
伪“比较器”)
此外,由于您有一个名为“map
”的变量,这可能会导致与STLmap
类冲突。更改变量名称(例如,将其称为myMap
),或使用std::
命名空间前缀作为std::map
类:
typedef map<string, string> MAP_STRING2STRING;
....
MAP_STRING2STRING myMap;
equal_to
不是正确的比较方式。您需要严格的弱排序(小于或大于类型比较)。当键为std::string
时,通常根本不需要将第三个模板参数传递给std::map
;默认值为std::less
,除非您需要一些特殊的排序,否则这很好。除了宏,不要使用大写字母。谢谢。:-)您是天才:)非常感谢您的最后一条评论,您可以使用auto,但您可能希望使用实际的类型名称来让代码更清晰。(这有点取决于iter
的范围。在一个小函数中,当变量上的所有操作都立即被清除时,我将使用auto
。但是,我决不会将它用于名称空间范围内的变量。)@JamesKanze:我同意你的观点,在名称空间范围内的变量不使用auto
。
typedef map<string, string> MAP_STRING2STRING;
....
MAP_STRING2STRING myMap;
auto iter = myMap.find(someKey);