Шаблонный метод для контейнеров с++

Имеется метод

void SortVector(vector<int>& vec, int topV, bool wozrastanie)

Хочу его сделать шаблонным, чтобы сортировать не только вектор, но и deque. Пишу такой код, но это не работает.

template <typename T>
void SortVector(T<int>& vec, int topV, bool wozrastanie)

Можно ли решить проблему не переписывая один и тот же метод под каждый контейнер?


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

Автор решения: Лев Чуприн

Решение моей проблемы

template <typename T>
void SortVector(T & vec, int topV, bool wozrastanie)

Пример использования

SortVector<vector<int>>(vec, topV, 0);
→ Ссылка
Автор решения: Harry

Ну, если очень хочется менять только контейнер, но при этом оставить тип элементов int - то используйте шаблонный аргумент шаблона:

template<template<class E,class Alloc=std::allocator<E>> typename Container>
void SortVector(Container<int>& vec, int topV, bool wozrastanie)
→ Ссылка
Автор решения: 232_159

Можно обратить свое внимание не то, как реализованы стандартные алгоритмы в stl (тот же самый std::sort). В чем особенность stl алгоритмов? - в одинаковых (с оговорками) интерфейсах у итераторов! У std::vector, std::list, std::deque, std::map и тд почти одинаковый интерфейс у итераторов. Как это используется в стандарте? Как мы можем это использовать?

template <typename IterType>
void user_func(IterType first, IterType last) //совершает какие то действия для диапазона [first, last)
{
    while (first != last)
    {
        std::cout << *first;
        ++first;
    }
    std::cout << '\n';
}

//проверяем
int main()
{
    std::vector<int> v = { 1, 2, 3, 4 };
    std::list<double> l = { 3, 2, 1, 3 };

    user_func(v.begin(), v.end());                   //выведет 1 2 3 4
    user_func(v.begin(), v.begin() + v.size() / 2);  //выведет 1 2
    user_func(l.begin(), l.end());                   //выведет 3 2 1 3
}
→ Ссылка
Автор решения: AR Hovsepyan

Если ваша функция должна обработать только стандартные контейнеры, то можно ввести ограничение, чтобы она принимала только объекты шаблонных классов, поскольку все стандартные контейнеры шаблонные. Но и лучше иметь возможность обработать контейнер с любым типом элементов(в случаи сортировки типы элементов должны иметь свойство сравниваться). И так, я предлагаю вариант:

template <typename T, template<typename> class   Cont>
void SortVector(Cont<T>& vec, int topV, bool wozrastanie)
{
    //...

}

Ну и вам решать для чего второй аргумент функции...

→ Ссылка