C++一个自定义的成员比较函数

C++ A custom member compare function

本文关键字:成员 比较 函数 自定义 一个 C++      更新时间:2023-10-16

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

#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::排序(vec.begin(),vec.end(),cmp);

将其设为静态成员函数或非成员函数。

如果您需要访问比较器中的类成员(尽管您的示例不需要),您可以使用下面注释中提到的任何一种方式,也可以使用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);
    }
);

如果你不想使用静态成员函数、非成员函数或lambda,我会把它作为另一个答案发布,正如@Paul的回复中提到的那样。你可以像一样从#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));
}