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

sim*_*ame 1 c++ foreach copy vector ostream

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

std::copy(vec.begin(), vec.end(), std::ostream_iterator<T>(std::cout, " ");
Run Code Online (Sandbox Code Playgroud)

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

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

这让我感觉这个for_each方法更好?

Ted*_*gmo 5

  1. 不,ostream_iterator使用重载并且不会创建额外的副本,如本演示std::ostream& operator<<(std::ostream&, const T&);中所示。
  2. ostream_iterator一个单遍LegacyOutputIterator,用于写入类型的连续对象T。目标范围可以被视为T打印在 上的 s std::cout

这让我感觉这个for_each方法更好?

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

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

for(auto& element : vec) std::cout << element << ' ';
Run Code Online (Sandbox Code Playgroud)