我需要创建一个从一个容器的开头和结尾接收迭代器的函数。然后它应该在控制台中显示内容。
我的问题是我不知道如何声明迭代器,以便它可以使用任何类型的容器
这就是我所做的:
template <class T>
void print(typename iterator<T> &beg, typename iterator<T> &end) {
while (beg != end) {
cout << *beg << endl;
beg++;
}
}
答案 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
类或任何其他类继承。除了其他优点之外,这允许该函数与数组一起使用。在你自己的代码中完全按照这样做,你就没事了:
#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));
}