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

How to write a generic function to print begin and end iterator elements

下面的函数 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"));
}

Demo

std::iterator_traits 救援。

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

typename std::iterator_traits<iter>::value_type

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