使用 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 确实有所需运算符的合适定义。您确定您已包含<
?如果是这样,它将被破坏,您应该提交错误报告,但很可能您误解了数据 - 在许多其他情况下会触发该错误,之前可能有人已经检测到它......当我告诉我的第一个老板说编译器出错了,他笑着说:99%的时候,问题出在椅子和键盘之间,而不是在编译器上
【参考方案1】:
错误 24 错误 C2676: 二进制 '
当您忘记包含<string>
时,这就是 VC 吐在您脸上的东西。该标头明确定义了此运算符。
【讨论】:
这只是发生在我身上,花了一个小时玩地图,然后一遍又一遍地出现这个错误。我想“为什么互联网上的每个例子都失败了!”。原来我忘记了一个该死的字符串标题。我现在觉得有点傻......以上是关于使用 std::string 作为 std::map 的键的主要内容,如果未能解决你的问题,请参考以下文章
为啥我可以在 std::map<std::string, int> 中使用 const char* 作为键
将 SWIG 与将 std::string 作为参数的方法一起使用
使用 std::string 作为字典顺序的键对 unordered_map 进行排序