C ++自定义成员比较函数

时间:2015-11-06 23:38:51

标签: c++ sorting compare

请考虑以下代码。我收到编译错误。我该如何编写自定义比较函数。

#include <iostream>
#include <vector>
#include <boost/cstdint.hpp>
#include <utility>
#include <algorithm>


class X 
{
  public:
    std::vector<std::pair<boost::uint64_t, boost::uint64_t> > vec;
    bool cmp(const std::pair<boost::uint64_t, boost::uint64_t>& d1,
        const std::pair<boost::uint64_t, boost::uint64_t>& d2);
    void foo(void);
    void print(void);
};

bool X::cmp(const std::pair<boost::uint64_t, boost::uint64_t>& d1,
    const std::pair<boost::uint64_t, boost::uint64_t>& d2)
{
  return d1.first < d2.first;
}

void X::foo(void)
{
  vec.push_back(std::make_pair(1000, 100));
  vec.push_back(std::make_pair(800, 200));
  std::sort(vec.begin(), vec.end(), cmp);
}

void X::print(void)
{
  for (auto it = vec.begin(); it != vec.end(); ++it)
  {
    std::cout << it->first << std::endl;
  }
}

  int
main()
{
  X x;
  x.foo();
  x.print();
  return 0;
}

编译错误:

 g++ --std=c++11 custom_cmparator.cpp 

 custom_cmparator.cpp: In member function ‘void X::foo()’:
 custom_cmparator.cpp:28:40: error: no matching function for call to       ‘sort(std::vector<std::pair<long unsigned int, long unsigned int>  >::iterator, std::vector<std::pair<long unsigned int, long unsigned int>  >::iterator, <unresolved overloaded function type>)’
 std::sort(vec.begin(), vec.end(), cmp);

我应该如何指定      std :: sort(vec.begin(),vec.end(),cmp);

2 个答案:

答案 0 :(得分:4)

使其成为静态成员函数或非成员。

如果你需要访问比较器中的类成员(虽然你的例子不需要它),你可以使用下面评论中提到的任何一种方式或者这样的lambda:

std::sort(vec.begin(), vec.end(),
    [this](const std::pair<boost::uint64_t, boost::uint64_t>& d1,
           const std::pair<boost::uint64_t, boost::uint64_t>& d2) {
               return this->cmp(d1, d2);
    }
);

答案 1 :(得分:2)

如果您不想使用静态成员函数或非成员函数或lambda,我会将此作为替代答案发布,如@Paul's response中所述。您可以使用#include <functional>中的std::bind

void X::foo(void)
{
    using namespace std::placeholders; // for _1, _2 etc

    vec.push_back(std::make_pair(1000, 100));
    vec.push_back(std::make_pair(800, 200));
    std::sort(vec.begin(), vec.end(), std::bind(&X::cmp, this, _1, _2));
}