Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::map::find不';行不通_C++_Visual C++_Stl - Fatal编程技术网

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
”的变量,这可能会导致与STL
map
类冲突。更改变量名称(例如,将其称为
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);