代码之家  ›  专栏  ›  技术社区  ›  tjwrona1992

在什么情况下,你更喜欢使用std::copy编写cout?

  •  1
  • tjwrona1992  · 技术社区  · 5 年前

    我一直在阅读Scott Meyers的《Effective STL》,我注意到书中有很多例子,他使用 std::copy 将元素复制到 std::cout 对我来说,与使用基于范围的替代方案相比,这感觉很难阅读 for 循环(也许我只是需要习惯它?)

    // Given the following
    std::vector<int> values = { 1, 2, 3, 4, 5, 6, 7, 8 };
    
    // Print using `std::copy`
    std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, ", "));
    
    // Print using a loop
    for (const auto value : values)
    {
        std::cout << value << ", ";
    }
    

    这篇文章似乎表明,使用 std::copy :

    is std::copy faster than std::cout for output?

    有些人真的发现 std::copy 比基于范围的方法更具可读性 对于 循环?


    也许如果我只想打印一半的值。。。

    std::copy(values.begin(), values.begin() + values.size()/2, std::ostream_iterator<int>(std::cout, ", "));
    

    …但即便如此,我也可以这样做:

    for (auto it = values.begin(); it != values.begin() + values.size()/2; ++it)
    {
        std::cout << *it << ", ";
    }
    

    所以我的问题是,为什么有人更喜欢 std::copy 方法?有什么情况可以证明吗 std::copy 真的是更好的选择(或唯一的选择)吗?

    0 回复  |  直到 5 年前
        1
  •  4
  •   463035818_is_not_an_ai    5 年前

    您可以在以下网址查看可能的实现 cppreference :

    template<class InputIt, class OutputIt>
    OutputIt copy(InputIt first, InputIt last, 
                  OutputIt d_first)
    {
        while (first != last) {
            *d_first++ = *first++;
        }
        return d_first;
    }
    

    它并没有什么神奇之处。它实际上只是一个从中复制元素的循环 Input Output 当然,它不使用基于范围的for循环(它有迭代器,而不是容器)。它使用a while 而不是 for ,这只是表面上的区别。

    是否有任何情况可以证明std::copy确实是一个更好的选择(或唯一的选择)?

    不可以。您始终可以手动编写与算法相同的代码。考虑到标准算法不应该比手写代码更好。它们应该和手写代码一样好,而不是更差。真正的好处是,使用算法可以减少错误的空间,并且更容易识别。编写复制内容的循环有很多不同的方法,但只有一种 std::copy ,这实际上有助于阅读代码。

    所以这一切都归结为意见。。。

    有些人真的觉得std::copy方法比基于范围的for循环更可读吗?

    是的,有些人认为应该尽量减少手写循环的使用,转而使用算法。然而,幸运的是,可能有不止一种意见,如果标准试图强制执行“没有原始循环”,那么基于范围的for循环可能永远不会被包括在内。