【发布时间】:2016-03-21 22:39:27
【问题描述】:
我想编写一个类似print_all 的函数,如下所述。
#include <iterator>
#include <vector>
template <typename V>
void print_all(std::iterator<std::input_iterator_tag, V> it) {
for (; it != std::end(it); ++it) {
V item = *it;
// do stuff with item
}
}
int main() {
std::vector<int> myvec (10);
print_all(myvec.cbegin());
return 0;
}
我如何声明 print_all 以便它可以接受类型为 V 的任何迭代器?
编辑
我想以类型安全的方式执行此操作。一个更好的用例示例是累加器
#include <iterator>
#include <vector>
#include <functional>
template <typename V, typename K>
K accumulate(
std::function<K(K, V)> accumulator,
std::iterator<std::input_iterator_tag, V> it,
std::iterator<std::input_iterator_tag, V> end,
K initial) {
K sum = initial;
for (; it != end; ++it) {
V item = *it;
sum = accumulator(sum, item);
}
return sum;
}
现在你明白为什么这个问题不是this 的重复了。我觉得会有一种类型安全的方法来做到这一点,其中编译器确保迭代器迭代正确的类型。这就是为什么我不愿接受史蒂夫·洛里默的回答。
【问题讨论】:
-
std::end(it)将不起作用 - 迭代器不知道他们正在迭代的容器 - 你需要传递结束迭代器,通过std::end(myvec)或myvec.end()找到 -
或者传递对容器本身的引用并在其上使用
std::begin()和std::end()来获取迭代器。 -
几乎是重复的,所以这里有很多不同的方法:stackoverflow.com/questions/10750057/…
-
您应该将您的编辑移到一个单独的问题中。
-
这是一个有趣的问题,@SteveLorimer。就我而言,您按照最初的措辞回答了这个问题,不幸的是,Sam 打算问一个完全不同的问题。