2014-05-16 64 views
0

我正在尝试编写基本的桶排序。我有一个函数,它接受一个向量的开始和结束迭代器。我需要将矢量的value_type模板化,以便我可以使用它为该排序创建一个桶的向量(使用std :: numeric_limits)。 该函数适用于T不大于短整数的T。使用模板容器迭代器的C++函数

下面是我写的函数:

template<typename T> 
typename std::vector<T>::iterator forwardIterator; 
void bucketSort(forwardIterator begin, forwardIterator end) { 
    std::vector<unsigned> bucketVec(std::numeric_limits<T>::max() + 1, 0); 
    for (auto it = begin; it != end; it++) 
    bucketVec[*it]++; 
    auto it = begin; 
    for (unsigned j = 0; j < bucketVec.size(); j++) 
    for (unsigned k = 0; k < bucketVec[j]; k++) 
     *it++ = j; 
} 

,当我尝试使用g ++编译这个和-std = C++ 11,-O3标志出现以下错误信息:

bucketSort.cpp:14:17: error: variable or field 'bucketSort' declared void 
bucketSort.cpp:14:17: error: 'forwardIterator' was not declared in this scope 
bucketSort.cpp:14:40: error: 'forwardIterator' was not declared in this scope 
bucketSort.cpp: in function 'int main()': 
bucketSort.cpp:55:46: error: 'bucketSort' was not declared in this scope 

我不明白我在做什么错,以及如何解决这个问题,以便它的工作。

+0

模板变量在C++之前是不可能的14。 – 0x499602D2

+0

'bucketVec(std :: numeric_limits :: max()+ 1,0)'似乎是非常错误的。如果'T'是无符号的,你的向量将有零个元素,如果'T'有符号,第一个参数将是一个很大的负数(有符号整型转换是未定义的行为)。 – Praetorian

+0

该函数不适用于任何大于16位的T.我最初在我的问题中编写过这个问题,但是编辑它并忘记重新写入。 – rminnema

回答

1

std::iterator_traits可以帮助您确定给定迭代器类型的值类型。

template<typename forwardIterator> 
void bucketSort(forwardIterator begin, forwardIterator end) { 
    using T = typename std::iterator_traits<forwardIterator>::value_type; 
    std::vector<unsigned> bucketVec(std::numeric_limits<T>::max() + 1, 0); 
    for (auto it = begin; it != end; it++) 
    bucketVec[*it]++; 
    auto it = begin; 
    for (unsigned j = 0; j < bucketVec.size(); j++) 
    for (unsigned k = 0; k < bucketVec[j]; k++) 
     *it++ = j; 
} 
+0

谢谢!这工作。我不知道iterator_traits或使用“使用”关键字。我将不得不阅读更多关于这两个。 – rminnema

+0

''使用'在这个意义上就像'typedef',只是它更容易看到你声明的内容,'using'可以形成一个模板别名,如'template using myvec = std :: vector ; ''。 – aschepler

+0

我发现这个函数只适用于无符号类型。为了让它适用于签名类型,我必须从bucketVec的大小和最后一行的j中减去std :: numeric_limits :: min()。 – rminnema