C ++函数与模板化容器中的迭代器

时间:2014-05-16 00:08:15

标签: c++ templates c++11 iterator

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

这是我写的功能:

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

我不明白我做错了什么,以及如何解决这个问题,以便它能够正常运作。

1 个答案:

答案 0 :(得分: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;
}