【问题标题】:std::map::find doesn't workstd::map::find 不起作用
【发布时间】:2013-07-19 08:16:03
【问题描述】:

我正在尝试将信息保存在 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);


我做错了什么?
仅当我在map 中有内容时才会出现此错误。

【问题讨论】:

  • equal_to 不是正确的比较方式。您需要严格的弱排序(小于或大于类型比较)。
  • 当key为std::string时,你通常根本不需要传递第三个模板参数给std::map;默认为std::less&lt;std::string&gt;,除非您需要特殊订购,否则这很好。
  • DONT_USE_ALL_UPPERCASE - MACROS 除外。谢谢。 :-)

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


【解决方案1】:

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

typedef map<string, string> MAP_STRING2STRING;

这相当于

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

在内部,map 使用严格的弱排序比较来对自身进行排序,并确定两个键是否相等。

第三个模板参数允许您使用自定义排序标准实例化地图。例如,这将创建一个与上述相反顺序的地图:

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

【讨论】:

  • 你是天才 :) 非常感谢
【解决方案2】:

如果你想要一个从std::stringstd::string 的简单映射,只需使用map&lt;string, string&gt;(去掉那个equal_to&lt;string&gt; 虚假的“比较器”)。

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

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

另外,由于你使用的是VS2010的错误信息,你可以使用方便的autoC++11关键字,避免MAP_STRING2STRING::const_iterator的“混乱”,直接使用:

auto iter = myMap.find(someKey);

【讨论】:

  • 写上您的最后一条评论,您可以使用 auto,但您可能希望使用实际的类型名称以使代码更清晰。 (这有点取决于iter 的范围。在一个小函数中,变量上的所有操作都立即清晰,我将使用auto。我永远不会将它用于命名空间范围内的变量,但是。)
  • @JamesKanze:我同意你在命名空间范围内不使用 auto 的观点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2017-07-18
  • 2012-02-05
相关资源
最近更新 更多