为啥将 std::sort 与自定义比较器一起使用无法编译?
Posted
技术标签:
【中文标题】为啥将 std::sort 与自定义比较器一起使用无法编译?【英文标题】:Why does this use of std::sort with a custom comparator not compile?为什么将 std::sort 与自定义比较器一起使用无法编译? 【发布时间】:2016-10-24 05:30:16 【问题描述】:我尝试使用排序算法对向量的元素进行排序。 这是我的代码 sn-p。
比较器
struct comparator
bool operator() ( OptVector<pair<int, pair<CgpPop*,CgpPop*> > >::iterator it1, OptVector<pair<int, pair<CgpPop*,CgpPop*> > >::iterator it2)
return ( ((*it1).first) < ((*it2).first));
o_comparator;
我的向量 - 这里的 OptVector 是向量的包装器,其行为方式与标准 c++ 向量相同。
OptVector< pair<int, pair<CgpPop*,CgpPop*> > > pll_units;
调用排序算法
sort<OptVector< pair<int, pair<CgpPop*,CgpPop*> > >::iterator > (pll_units.begin(), pll_units.end(), o_comparator);
但是编译器抛出以下错误
/calm/svr/sql/generic/stlinclude/stl/_algo.c: In function ‘const _Tp& _STL::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >, _Compare = comparator]’:
/calm/svr/sql/generic/stlinclude/stl/_algo.c:820: instantiated from ‘void _STL::__introsort_loop(_RandomAccessIter, _RandomAccessIter, _Tp*, _Size, _Compare) [with _RandomAccessIter = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _Tp = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >, _Size = long int, _Compare = comparator]’
/calm/svr/sql/generic/stlinclude/stl/_algo.c:841: instantiated from ‘void _STL::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _Compare = comparator]’
/calm/svr/sql/generic/source/codegen/cgpop.cpp:1249: instantiated from here
/calm/svr/sql/generic/stlinclude/stl/_algo.c:78: error: no match for call to ‘(comparator) (const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&, const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&)’
/calm/svr/sql/generic/source/codegen/cgpop.cpp:1192: note: candidates are: bool comparator::operator()(_STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*)
/calm/svr/sql/generic/stlinclude/stl/_algo.c:79: error: no match for call to ‘(comparator) (const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&, const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&)’
/calm/svr/sql/generic/source/codegen/cgpop.cpp:1192: note: candidates are: bool comparator::operator()(_STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*)
谁能告诉我我的错误是什么?
【问题讨论】:
【参考方案1】:比较器函子应该将元素而不是迭代器作为比较参数。
您应该将comparator::operator()
的参数类型从迭代器更改为值类型:
struct comparator
bool operator() ( const pair<int, pair<CgpPop*,CgpPop*> > & lhs, const pair<int, pair<CgpPop*,CgpPop*> > & rhs) const
return lhs.first < rhs.first;
;
顺便说一句:制作operator()
const 成员函数是一个好习惯。
【讨论】:
对sort()
的调用也可以缩短为sort(pll_units.begin(), pll_units.end(), o_comparator);
此外,自 C++11 以来,lambda 就是该语言的一部分。
谢谢大家......它工作......我也以更好的方式理解了这些用法。
@Leon。你能解释一下为什么它没有在排序方法中给出模板参数就可以工作吗?我的印象是,对于模板方法,我应该提供类型参数。
@AbhishekGupta 因为template argument deduction 用于模板函数调用。以上是关于为啥将 std::sort 与自定义比较器一起使用无法编译?的主要内容,如果未能解决你的问题,请参考以下文章
如果比较函数不是运算符 <,为啥 std::sort 会崩溃?
将 std::sort 与并行执行策略一起使用时,我必须考虑啥?
如何将 std::sort() 与 std::unique_ptr<[]> 一起使用?