使用比较函数
using comparing function
我有这个函数
std::vector <std::vector <int> > puddles;
std::set <int> is_checked;
size_t M, N;
bool v_compare(int a, int b){
return puddles[(a-a%M)/M][a%M] < puddles[(b-b%M)/M][b%M];
}
,我想找到与puddles
中最小值对应的集合元素(我使用i*M+j
作为集合中的键)。因此,我试图使用我的函数作为min_element
close(*std::min_element(is_checked.begin(), is_checked.end(), v_compare));
但是我得到了这个错误
:113:82: error: no matching function for call to 'min_element(std::set<int>::iterator, std::set<int>::iterator, <unresolved overloaded function type>)'
:113:82: note: candidates are:
/usr/include/c++/4.6/bits/stl_algo.h:6173:5: note: template<class _FIter> _FIter std::min_element(_FIter, _FIter)
/usr/include/c++/4.6/bits/stl_algo.h:6201:5: note: _FIter std::min_element(_FIter, _FIter, _Compare) [with _FIter = std::_Rb_tree_const_iterator<int>, _Compare = bool (TFlood::*)(int, int)]
/usr/include/c++/4.6/bits/stl_algo.h:6201:5: note: no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (TFlood::*)(int, int)'
指向函数的指针和指向成员函数的指针是有区别的。一个不是static
的类成员给你一个指向成员函数的指针。但是std::min_element
只接受指向函数或其他可调用类型的指针,而指向成员函数的指针不符合条件,因为如果没有指向类对象的指针或引用,就不能调用它。正如你所发现的,如果你试图使函数成为static
成员,那么它就不能得到M
成员。(如果puddles
也是成员的话,也可以。)
看起来你正在使用g++ 4.6,它支持lambdas。所以最简单的解决方案是:
close(*std::min_element(is_checked.begin(), is_checked.end(),
[this](int a, int b) { return puddles[a/M][a%M] < puddles[b/M][b%M]; }));
(我去掉了减法,因为整数类型的除法总是趋向于零,所以(a-(a%M))/M
总是与a/M
得到相同的结果。)确保使用-std=c++0x
编译器标志。lambda魔术负责"捕获"this
指针,供比较对象稍后使用。
相关文章:
- C++自定义比较函数
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++模板函数,用于比较任何无符号整数和有符号整数
- 函数类作为比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- std::max() 函数与定点实现的比较中的问题
- 如何比较两个函数的速度和性能
- 对没有比较器或λ函数的向量进行排序?
- 使用迭代器的自定义比较器函数
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 比较 n 女王的 next_permutation 函数
- 用于基于成员字段或函数创建比较器的快捷方式
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 为什么在类或结构中传递自定义比较器函数?
- 浮点数比较为什么没有相等的函数
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 为什么函数比较器不像在排序中那样在优先级队列中工作?
- c++ STL集合的比较函数:比较函数可以是类的成员函数吗?
- 联合值的单函数比较