C++一个自定义的成员比较函数
C++ A custom member compare function
请考虑以下代码。我遇到一个编译错误。我应该如何编写自定义比较函数。
#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));
}
相关文章:
- 三向比较运算符成员与非成员实现
- 用于基于成员字段或函数创建比较器的快捷方式
- 如何通过比较彼此的成员从QStringList中删除元素
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 重载对象成员的比较运算符
- 如何使用自定义比较器初始化类数据成员,该成员是 std::set
- 将比较器传递给Priority_queue,称为班级成员
- 具有多个空成员的 std::元组上的比较无法在 GCC 上编译
- 标准::元组成员逐个成员比较失败
- 通过构造函数与直接初始化进行成员初始化的比较
- 为什么比较和交换操作同时存在免费函数和成员函数?
- 没有成员作为唯一标识符的两个类实例的比较
- 将对象成员数组与字符串进行比较
- 比较存储在向量中的类对象的私有成员变量 - C++
- 将非静态数据成员与常量成员进行比较
- std::具有自定义比较函数结果的排序函数错误:必须调用对非静态成员函数的引用
- C++使用成员字段设置比较器
- 如何比较 2 个对象的私有成员?
- 使用结构的成员变量比较 next_permutation()
- C++一个自定义的成员比较函数