【问题标题】:differences between std::for_each and std::copy, std::ostream_iterator<T> when printing a vector打印向量时 std::for_each 和 std::copy, std::ostream_iterator<T> 之间的区别
【发布时间】:2022-01-15 18:56:44
【问题描述】:

最近,我遇到了像这样打印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 我可以有一个 const 引用。
  2. copy 的文档声明它将元素从一个范围复制到另一个范围。 std::ostream_iterator&lt;T&gt; 范围如何?如果是,那么它从哪里开始和结束?
  3. 我需要模板化copy方法,而for_each我可以只auto,这似乎更方便。

这让我觉得for_each 方法更好?

【问题讨论】:

    标签: c++ vector foreach copy ostream


    【解决方案1】:
    1. 不,ostream_iterator 使用 std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const T&amp;); 重载,不会创建额外的副本,如 this demo 所示。
    2. ostream_iterator 是一个单遍LegacyOutputIterator,它写入T 类型的连续对象。目标范围可以看作是印在std::cout 上的Ts。

    这让我觉得for_each 方法更好?

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 2021-07-10
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2014-03-04
      • 2013-01-18
      相关资源
      最近更新 更多