gpt4 book ai didi

c++ - 如何使用 boost::bind 为 std::set 定义排序标准

转载 作者:行者123 更新时间:2023-11-30 01:26:43 25 4
gpt4 key购买 nike

我想我在集合术语上遗漏了一些东西。

以下代码可以很好地对 vector 进行排序:

using boost::bind;
std::vector<SegPoly> result;
//...
std::sort(result.begin(),result.end(),bind(std::less<double>(),bind(&SegPoly::getLength,_1), bind(&SegPoly::getLength,_2)));

但我不能对 std::set

使用这样的排序标准
 using boost::bind;
std::set<SegPoly> polySet(inPolys.begin(),inPolys.end(),bind(std::less<double>(),bind(&SegPoly::getLength,_1), bind(&SegPoly::getLength,_2)));

这给出了一个超出我能力范围的神秘编译错误:

没有匹配函数调用 'std::set, std::allocator >::set(__gnu_cxx::__normal_iterator >>, __gnu_cxx::__normal_iterator >>, boost::_bi::bind_t, boost::_bi::list2, boost::_bi::list1 >>, boost::_bi::bind_t, boost::_bi::list1 >>> >)'

有人知道错误在哪里吗?

最佳答案

没有错误。创建 std::set 时需要指定比较函数/仿函数,它是类型的一部分。现在,boost::bind 的类型是未指定的,因为根据参数,它可以创建多种类型。

一个解决方案可能是使用boost::function:

typedef std::set<SegPoly, boost::function<bool(unsigned, unsigned)> > set_type;
set_type s(inPolys.begin(), inPolys.end(),
boost::bind(std::less<double>(),boost::bind(&SegPoly::getLength,_1), boost::bind(&SegPoly::getLength,_2)));

一种更好且最有可能更高效的选择是创建您自己的比较器:

struct SegPolyComp{
bool operator()(SegPoly const& lhs, SegPoly const& rhs) const{
return lhs.getLength() < rhs.getLength();
}
}

std::set<SegPoly, SegPolyComp> s(inSegPoly.begin(), inSegPoly.end());

关于c++ - 如何使用 boost::bind 为 std::set 定义排序标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795231/

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