gpt4 book ai didi

c++ - 使用比较功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:37 25 4
gpt4 key购买 nike

我有这个功能

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 也是,如果它也是一个成员的话。)

看起来您使用的是支持 lambda 的 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 指针供比较对象稍后使用。

关于c++ - 使用比较功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15342363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com