使用比较功能

时间:2013-03-11 15:26:13

标签: c++ stl operator-overloading overloading

我有这个功能

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中的最小值对应的set元素(我使用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)'

1 个答案:

答案 0 :(得分:1)

指向函数的指针和指向成员函数的指针之间存在差异。不是static的类成员会获得指向成员函数的指针。但std::min_element只接受指向函数或其他可调用类型的指针,并且指向成员函数的指针不符合条件,因为如果没有指针或对类对象的引用则无法调用它。正如您所发现的,如果您尝试将该函数设为static成员,则无法访问成员M。 (也许puddles,如果那也是会员。)

看起来你正在使用支持lambdas的g ++ 4.6。所以最简单的解决方案是:

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指针以供比较对象稍后使用。