声明一个模板函数,它接收两个通用迭代器作为参数

时间:2017-12-31 18:54:26

标签: c++ templates

我需要创建一个从一个容器的开头和结尾接收迭代器的函数。然后它应该在控制台中显示内容。

我的问题是我不知道如何声明迭代器,以便它可以使用任何类型的容器

这就是我所做的:

template <class T>
void print(typename iterator<T> &beg, typename iterator<T> &end) {
    while (beg != end) {
        cout << *beg << endl;
        beg++;
    }
}

2 个答案:

答案 0 :(得分:5)

std::iterator课真的只是一个方便;标准中没有任何内容要求所有迭代器都从它继承。另外,std::iterator没有虚拟方法,因此它与在Java中使用Iterator<T>几乎不同,在Java中,调用next()方法将调用适当的 next()。您希望采用常规类型T,而不仅仅是std::iterator,以便编译器在编译时解析为operator++operator*的正确重载。 / p>

template <typename T>
void print(T iter, const T& end) {
    // Taking the first argument by value ensures that
    // we don't modify the caller's variables
    while (iter != end) {
        cout << *iter << endl;
        ++iter;
    }
}

这适用于任何前向迭代器,这是你在99%的时间内处理的。

答案 1 :(得分:3)

  

我需要创建一个从begin接收迭代器的函数   和一个容器的末端。

了解标准函数的用途,例如std::find

template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );

观察:

  • InputIt不需要从(现在过时的)std::iterator类或任何其他类继承。除了其他优点之外,这允许该函数与数组一起使用。
  • 相同的迭代器类型用于开始和结束。
  • 迭代器是passed by value
  • 模板参数未指定迭代器&#39;价值类型。

在你自己的代码中完全按照这样做,你就没事了:

#include <iostream>
#include <vector>

template <class Iterator> // not T
void print(Iterator beg, Iterator end) {
    while (beg != end) {
        std::cout << *beg << '\n';
        beg++;
    }
}

int main() {
    std::vector<int> const vec = { 1, 2, 3 };
    int const array[] = { 1, 2, 3 };
    using std::begin;
    using std::end;
    print(begin(vec), end(vec));
    print(begin(array), end(array));
}