打印矢量时 std::for_each 和 std::copy、std::ostream_iterator<T> 之间的差异

differences between std::for_each and std::copy, std::ostream_iterator<T> when printing a vector

最近,我遇到了这样打印 vector 的代码

std::copy(vec.begin(), vec.end(), std::ostream_iterator<T>(std::cout, " ");

将其与我习惯的进行比较(for_each 或基于范围的 for 循环)

auto print = [](const auto & element){std::cout << element << " ";};
std::for_each(vec.begin(), vec.end(), print);
  1. copy 方法是否创建额外的副本?在 for_each 我可以有一个常量引用。
  2. copy 的文档指出它将元素从一个范围复制到另一个范围。 std::ostream_iterator<T> 是一个范围吗?如果是,那么它从哪里开始和结束?
  3. 我需要模板化 copy 方法,而 for_each 我可以 auto 这样看起来更方便。

这让我觉得 for_each 方法更好?

  1. 不,ostream_iterator 使用 std::ostream& operator<<(std::ostream&, const T&); 重载并且不会创建额外的副本,如 this demo.
  2. 中所示
  3. ostream_iterator 是单遍 LegacyOutputIterator,它写入类型 T 的连续对象。目标范围可以看作是打印在 std::cout.
  4. 上的 Ts

This makes me feel like the for_each method is better?

std::for_each 是一种更通用的算法。使用 std::copy 指定您的目标是从一个范围复制到另一个范围。有人会说这更容易理解,因此使代码更容易维护。

另一方面,简单的基于范围的 for 循环也很容易理解:

for(auto& element : vec) std::cout << element << ' ';