使用 std::string 作为 std::map 的键

Posted

技术标签:

【中文标题】使用 std::string 作为 std::map 的键【英文标题】:Using an std::string as a key for an std::map 【发布时间】:2011-06-23 18:39:08 【问题描述】:

我想要一个 std::map (int .NET 4.0)。我们当然知道地图是一棵树,并且需要一个 operator

错误 24 错误 C2676: 二进制 '

所以我让我的 google-foo 工作并找到了这个解决方案:

struct StringComparerForMap

public:
    bool operator()(const std::string x, const std::string y)
    
         // Add compare logic here
    
;

...
std::map<std::string, CustomObject, StringComparerForMap> myMap;

这在一段时间内工作得很好,现在我遇到了一个我认为是由于这个原因的错误。在 STL 框架的某个深处,它似乎忽略了上述定义并默认为 operator<.>

在 VS2010 .NET 4.0 中有没有办法使用字符串作为映射的键?

我知道我可以获取该字符串并编写一个函数将其散列为一个 int,但其中的乐趣在哪里?

编辑

我会尽力为大卫解释这一点。当映射使用比较器结构时,它会在发布时崩溃,并在调试中使调试断言失败。失败的断言在 xtree 第 1746 行。

表达式:无效的运算符

|中止| |重试| |忽略|

这让我相信,尽管给 map 一个比较器,但它仍然在某些路径下默认为 operator

CustomObject o = stringObjectMap[key];

【问题讨论】:

std::string 确实有所需运算符的合适定义。您确定您已包含 标头吗?我想当我没有包含它时,我已经看到了类似的问题; std::string 的前向声明意味着它的名称本身是已知的。 .NET 与 std::map 或 std::string 无关 是什么让你认为库层的深处默认为&lt;?如果是这样,它将被破坏,您应该提交错误报告,但很可能您误解了数据 - 在许多其他情况下会触发该错误,之前可能有人已经检测到它......当我告诉我的第一个老板说编译器出错了,他笑着说:99%的时候,问题出在椅子和键盘之间,而不是在编译器上 【参考方案1】:

错误 24 错误 C2676: 二进制 '

当您忘记包含&lt;string&gt; 时,这就是 VC 吐在您脸上的东西。该标头明确定义了此运算符。

【讨论】:

这只是发生在我身上,花了一个小时玩地图,然后一遍又一遍地出现这个错误。我想“为什么互联网上的每个例子都失败了!”。原来我忘记了一个该死的字符串标题。我现在觉得有点傻......

以上是关于使用 std::string 作为 std::map 的键的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::string 作为 std::map 的键

为啥我可以在 std::map<std::string, int> 中使用 const char* 作为键

将 SWIG 与将 std::string 作为参数的方法一起使用

使用 std::string 作为字典顺序的键对 unordered_map 进行排序

在 std::string 中使用非法 UTF-8 八位字节作为分隔符

使用 std::string 作为通用 uint8_t 缓冲区