Как правильно реализовать функцию/метод принимающий на вход компаратор?

Вот для примера возьмем функцию сортировки пузырьком, как правильно реализовать в ней компаратор?

template<class Iterator>
void BubbleSort(Iterator first, Iterator last) {
    for (Iterator i = first; i < last; i++) {
        for (Iterator j = first; j != last; j++) {
            if (*j > *(j + 1)) {
                std::swap(*j, *(j + 1));
            }
        }
    }
}

Ответы (1 шт):

Автор решения: Harry

Примерно так..

template<class Iterator, class Comparator>
void BubbleSort(Iterator first, Iterator last, Comparator cmp)
...
       if (cmp(*j,*(j + 1))) {
...

Но я бы делал так:

template<typename Iter, typename Less>
void BubbleSort(Iter b, Iter e, Less c)
{
    --e;
    for(; b != e; ++b)
        for(Iter k = e, j = k--; j != b; j = k--)
            if (c(*j,*k)) swap(*j,*k);
}

Для параметра по умолчанию можно сделать так:

template<typename Iter, typename Less>
void BubbleSort(Iter b, Iter e, Less c)
{
    --e;
    for(; b != e; ++b)
        for(Iter k = e, j = k--; j != b; j = k--)
            if (c(*j,*k)) swap(*j,*k);
}

template<typename Iter>
void BubbleSort(Iter b, Iter e)
{
    BubbleSort(b, e, std::less<>());
}
→ Ссылка