声明一个模板函数,该函数接收两个泛型迭代器作为参数

Declare a template function which receives two generic iterator as parameters

本文关键字:函数 泛型 两个 参数 迭代器 一个 声明      更新时间:2023-10-16

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

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

这是我所做的:

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

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

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% 的时间正在处理的问题。

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

看看标准函数是如何做到的,例如std::find

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

观察:

  • InputIt不需要从(现已过时的(std::iterator类或任何其他类继承。除其他优点外,这允许该函数与数组一起使用。
  • 开始和结束使用相同的迭代器类型。
  • 迭代器按值传递。
  • 模板参数不指定迭代器的值类型。

只需在您自己的代码中完全按照这样操作,您就会没事的:

#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));
}