如何编写一个通用函数来打印开始和结束迭代器元素



下面的函数printloop能够打印集合中的元素,如下所示。但是,如果我试图删除循环并使用std::copy,我该如何让那个版本打印出来?

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
// this print function doesn't compile
template <typename iter>
void print(iter begin, iter end) {
std::copy(begin, end, 
std::ostream_iterator< what type? >(std::cout, "t"));
}
template <typename iter>
void printloop(iter begin, iter end) {
while (begin != end) {
std::cout << *begin << 't';
begin++;
}
}
int main() {
std::vector<int> vec {1,2,3,4,5};
printloop(vec.begin(), vec.end());  // works ok
print(vec.begin(), vec.end()); // how to get working?
}

您可以使用iterator_traits:

template <typename iter>
void print(iter begin, iter end) {
using value_type = typename std::iterator_traits<iter>::value_type;
std::copy(begin, end, std::ostream_iterator<value_type >(std::cout, "t"));
}

演示

std::iterator_traits前往救援。

给定一个迭代器类型iter,被迭代的类型是

typename std::iterator_traits<iter>::value_type

即使迭代器没有定义iter::value_type,例如迭代器是一个原始指针,该解决方案也可以工作。

最新更新