我有一个对象的地图作为键,而bool作为值。当我尝试使用map :: find方法找到已经包含的某个对时,它没有找到任何项目。我做错了什么?
我试图在地图中实现一个比较器类并将其设置为key_comp,但我不确定我做得对。这是解决方案吗?
我在VS12工作,我附上了调试的照片,你应该从中了解更多:
答案 0 :(得分:3)
您正在使用find
致电pair<char *, char*>(0x00ffc468, 0x00ffbdb0)
。集合中没有这样的对,因此find
会返回end
。
您的代码会比较char *
,它会检查它们是否指向内存中的相同位置,而不是它们是否指向相同的内容。您应该使用std::string
而不是char *
而不是重新发明轮子。
以下是您可以使用的可能比较功能的示例:
bool less(
std::pair<char *, char *> const& p1,
std::pair<char *, char *> const& p2)
{
int i = strcmp (p1.first, p2.first);
if (i < 0)
return true;
if (i > 0)
return false;
return strcmp (p1.second, p2.second) < 0;
}
答案 1 :(得分:0)
如果您必须在地图中使用std:pair<char*, char*>
作为键,则可以在创建地图时使用以下仿函数。
struct MyCompare
{
bool operator()(std::pair<char const*, char const*> const& lhs,
std::pair<char const*, char const*> const& rhs)
{
int n1 = strcmp(lhs.first, rhs.first);
if ( n1 != 0 )
{
return n1 < 0;
}
return (strcmp(lhs.second, rhs.second) < 0);
}
};
typedef std::map<std::pair<char*,char*>, int, MyCompare> MyMap;
MyMap myMap;