为什么这个使用std :: sort与自定义比较器不能编译?

Abh*_*pta 2 c++ templates stl

我尝试使用排序算法来排序向量的元素.这是我的代码片段.

比较

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;
Run Code Online (Sandbox Code Playgroud)

我的向量 - 这里的OptVector是一个包装器,它的行为方式与标准的c ++向量相同.

OptVector< pair<int, pair<CgpPop*,CgpPop*> > > pll_units;
Run Code Online (Sandbox Code Playgroud)

打电话给algo

sort<OptVector< pair<int, pair<CgpPop*,CgpPop*> > >::iterator > (pll_units.begin(), pll_units.end(), o_comparator);
Run Code Online (Sandbox Code Playgroud)

但是编译器会抛出以下错误

/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*> >*)
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我,我的错误是什么?

son*_*yao 5

比较器仿函数应该将元素而不是迭代器作为比较参数.

您应该将参数类型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;
    }
};
Run Code Online (Sandbox Code Playgroud)

BTW:使operator()const成员函数是一个好习惯.