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)
copy方法是否会创建额外的副本?在for_each我可以有一个常量引用。copy指出它将元素从一个范围复制到另一个范围。std::ostream_iterator<T>范围如何?如果是的话那么它从哪里开始和结束?copy方法模板化,而for_each我可以auto这样看起来更方便。这让我感觉这个for_each方法更好?
ostream_iterator使用重载并且不会创建额外的副本,如本演示std::ostream& operator<<(std::ostream&, const T&);中所示。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)