2014-05-16 60 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