#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 Из-за вычитания аргумента шаблона для вызова функции шаблона.