C ++ map :: find for pair作为键

时间:2014-04-28 01:22:31

标签: c++ visual-studio-2012 stdmap std-pair

我有一个对象的地图作为键,而bool作为值。当我尝试使用map :: find方法找到已经包含的某个对时,它没有找到任何项目。我做错了什么?

我试图在地图中实现一个比较器类并将其设置为key_comp,但我不确定我做得对。这是解决方案吗?

我在VS12工作,我附上了调试的照片,你应该从中了解更多:

enter image description here

2 个答案:

答案 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;