Почему это использование std:: sort с пользовательским компаратором не компилируется?

#c #templates #stl

#c #шаблоны #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;
  

Мой вектор — Здесь 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 _Tpamp; _STL::__median(const _Tpamp;, const _Tpamp;, const _Tpamp;, _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*> >amp;, const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >amp;)’
 /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*> >amp;, const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >amp;)’
/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*> > amp; lhs, const pair<int, pair<CgpPop*,CgpPop*> > amp; rhs) const
    {
        return lhs.first < rhs.first;
    }
};
  

Кстати: Создание operator() функции-члена const является хорошей привычкой.

Комментарии:

1. Также вызов sort() может быть сокращен до sort(pll_units.begin(), pll_units.end(), o_comparator);

2. Кроме того, лямбды являются частью языка начиная с C 11.

3. спасибо всем … это сработало … и я также лучше понял способы использования.

4. @Leon . не могли бы вы, пожалуйста, объяснить мне, почему это сработало без указания аргумента шаблона в методе сортировки. У меня сложилось впечатление, что для метода template я должен предоставить аргумент type.

5. @AbhishekGupta Из-за вычитания аргумента шаблона для вызова функции шаблона.