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);
}
我正在尝试模板化函数,但在vector :: iterator之前得到的错误是我缺少typename。任何人都可以对制作这个功能模板有所了解吗?
总之,我试图将iterator参数作为模板。
答案 0 :(得分:5)
您应该使用std::distance
,std::next
(或c ++ 03中的std :: advance)进行计算。
此外,硬编码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);
}
为了完整性,这里有一个整合比较谓词和按降序排序 live on 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 << " ";
}
答案 1 :(得分:1)
我并没有把它敲出来。我在一个旧的源文件中有它,但我认为这是你想要做的。我添加了两个额外的接口,用于排序固定数组和具有指定长度的任意基指针。希望它有所帮助:
#include <iterator>
#include <algorithm>
// general mergesort algorithm
template <
typename Iterator,
typename Compare=std::less<typename std::iterator_traits<Iterator>::value_type>
>
void mergesort(Iterator first, Iterator last, const Compare& cmp=Compare())
{
size_t n = std::distance(first, last)/2;
if (n == 0)
return;
Iterator mid = std::next(first, n);
mergesort(first, mid, cmp);
mergesort(mid, last, cmp);
std::inplace_merge(first, mid, last, cmp);
}
// front-loader for static arrays
template<typename Item, size_t N>
void mergesort(Item (&ar)[N])
{
mergesort(std::begin(ar), std::end(ar));
}
// front-loader for size-specified base-pointer arrays
template<typename Item>
void mergesort(Item *ptr, size_t N)
{
mergesort(ptr, ptr+N);
}
答案 2 :(得分:1)
得到错误,我错过了vector :: iterator
之前的typename
正如错误所述,您在typename
之前错过了vector<T>::iterator
:
void Merge_Sort(typename vector<T>::iterator begin, typename vector<T>::iterator end)
^^^^^^^^ ^^^^^^^^
指定依赖类型名称时需要这样:嵌套在模板中的类型名称,取决于模板参数。在模板实例化之前,编译器不知道名称代表什么,所以你必须告诉它它命名一个类型。
总之,我试图将iterator参数作为模板。
那么这样做可能会更好:
template <typename Iter>
void Merge_Sort(Iter begin, Iter end);