打印矢量时 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);
copy
方法是否创建额外的副本?在 for_each
我可以有一个常量引用。
copy
的文档指出它将元素从一个范围复制到另一个范围。 std::ostream_iterator<T>
是一个范围吗?如果是,那么它从哪里开始和结束?
- 我需要模板化
copy
方法,而 for_each
我可以 auto
这样看起来更方便。
这让我觉得 for_each
方法更好?
- 不,
ostream_iterator
使用 std::ostream& operator<<(std::ostream&, const T&);
重载并且不会创建额外的副本,如 this demo. 中所示
ostream_iterator
是单遍 LegacyOutputIterator,它写入类型 T
的连续对象。目标范围可以看作是打印在 std::cout
. 上的 T
s
This makes me feel like the for_each
method is better?
std::for_each
是一种更通用的算法。使用 std::copy
指定您的目标是从一个范围复制到另一个范围。有人会说这更容易理解,因此使代码更容易维护。
另一方面,简单的基于范围的 for 循环也很容易理解:
for(auto& element : vec) std::cout << element << ' ';
最近,我遇到了这样打印 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);
copy
方法是否创建额外的副本?在for_each
我可以有一个常量引用。copy
的文档指出它将元素从一个范围复制到另一个范围。std::ostream_iterator<T>
是一个范围吗?如果是,那么它从哪里开始和结束?- 我需要模板化
copy
方法,而for_each
我可以auto
这样看起来更方便。
这让我觉得 for_each
方法更好?
- 不,
ostream_iterator
使用std::ostream& operator<<(std::ostream&, const T&);
重载并且不会创建额外的副本,如 this demo. 中所示
ostream_iterator
是单遍 LegacyOutputIterator,它写入类型T
的连续对象。目标范围可以看作是打印在std::cout
. 上的
T
s
This makes me feel like the
for_each
method is better?
std::for_each
是一种更通用的算法。使用 std::copy
指定您的目标是从一个范围复制到另一个范围。有人会说这更容易理解,因此使代码更容易维护。
另一方面,简单的基于范围的 for 循环也很容易理解:
for(auto& element : vec) std::cout << element << ' ';