你如何为地图编写可选的比较仿函数?

时间:2013-03-30 21:04:34

标签: c++

假设我有:map<map_data, int, decltype(compare)> the_map

struct map_data{
   int data1;
   int data2;
}

我尝试过将compare写成:

struct
{
   bool operator()(map_data one, map_data two) const
   {
      if(one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < two.data1;
   }
}compare;

但是我收到了很多编译错误。我在这里做错了吗?

2 个答案:

答案 0 :(得分:2)

我想它必须如此:

struct compare
{
   bool operator()(map_data const& one, map_data const& two) const
   {
      if(one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < one.data2;
   }
};

此外,您不需要decltype。直接使用仿函数类的名称:

std::map<map_data, int, compare> the_map;
//                      ^^^^^^^

在这里,您可以看到上面代码编译的live example

答案 1 :(得分:1)

您在map_data定义后忘记了分号。修复,compilation in C++11 is successful

#include <map>

using std::map;

struct map_data{
   int data1;
   int data2;
};

struct
{
   bool operator()(map_data one, map_data two) const
   {
      if(one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < two.data1;
   }
}compare;

int main() {
    map<map_data, int, decltype(compare)> the_map;
}

然而,为此要求C ++ 11 decltype似乎有点浪费,并且当你真正需要的只是类型时实例化一个对象compare

为什么不be conventional

#include <map>

using std::map;

struct map_data {
   int data1;
   int data2;
};

struct map_data_comparator
{
   bool operator()(const map_data& one, const map_data& two) const
   {
      if (one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < two.data1;
   }
};

int main()
{
    map<map_data, int, map_data_comparator> the_map;
}

你可以看到我也做了你的比较器参数 const references ,只是为了它真的。