声明一个模板函数,该函数接收两个泛型迭代器作为参数
Declare a template function which receives two generic iterator as parameters
我需要创建一个函数,从一个容器的开头和结尾接收迭代器。然后,它应该在控制台中显示内容。
我的问题是我不知道如何声明迭代器,以便它可以与任何类型的容器一起使用
这是我所做的:
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));
}
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型枚举和其他类型的重载模板函数
- 可变参数泛型 lambda 和函数重载
- 以特征类型作为参数的泛型函数回调
- 传递非泛型函数的最有效方法是什么?
- 泛型模板函数始终返回整数值
- 泛型函数反向打印任何矢量,编译器出错
- C++泛型包装类,它为某些函数添加了额外的处理
- 是否可以在C++中创建泛型函数指针?
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- 是否可以使用泛型枚举类型作为函数的参数?
- 将泛型函数及其参数传递给元函数
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 获取模板函数/泛型 lambda 的唯一返回类型
- 这是为浮点数/双精度函数泛型的正确方法吗?
- 使字段函数泛型
- 将函数泛型地传递给c++模板
- 我如何使这个函数泛型,以便它接受任何容器