vector iterator参数作为模板C++

1 c++ templates iterator

template<typename T>
void Merge_Sort(vector<T>::iterator begin, vector<T>::iterator end) {

size_t length = end - begin;
if (1 >= length) return;

size_t mid = length/2;

Merge_Sort(begin, begin + mid);
Merge_Sort(begin + mid, end);
inplace_merge(begin, begin + mid, end);
}
Run Code Online (Sandbox Code Playgroud)

我试图模板化函数但得到错误,我错过了vector :: iterator之前的typename.有没有人有关于制作这个功能模板的想法?

总之,我试图将iterator参数作为模板.

seh*_*ehe 5

您应该使用std::distance,std::next(或std ::在C++ 03提前)做计算.

此外,硬编码vector与使其成为通用的相反,IYAM

template<typename It>
void Merge_Sort(It begin, It end) {
    size_t length = std::distance(begin, end);
    if (1 >= length) return;

    size_t mid = length/2;

    auto pivot = std::next(begin, mid);

    Merge_Sort(begin, pivot);
    Merge_Sort(pivot, end);
    inplace_merge(begin, pivot, end);
}
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里有一个将比较谓词和排序按照降序排列在Coliru上

#include <algorithm>
#include <vector>
#include <iterator>

template<typename It, 
    typename Cmp = typename std::less<typename std::iterator_traits<It>::value_type> >
void Merge_Sort(It begin, It end, Cmp cmp = Cmp()) {
    size_t length = std::distance(begin, end);
    if (length<2) return;

    size_t mid = length/2;

    auto pivot = std::next(begin, mid);

    Merge_Sort(begin, pivot, cmp);
    Merge_Sort(pivot, end, cmp);
    std::inplace_merge(begin, pivot, end, cmp);
}

#include <iostream>

int main()
{
    std::vector<int> v { 1,3,7,-3,4,99,-13 };

    Merge_Sort(begin(v), end(v), std::greater<int>());

    for(auto i : v)
        std::cout << i << " ";
}
Run Code Online (Sandbox Code Playgroud)