将 'for loop' 替换为 std::for_each

Replace 'for loop' using std::for_each

我在下面的代码中有一个 for 循环,我想使用 std::for_each 来实现它。我已经实施了。有人可以告诉我这是否是使用 std::for_each 的最佳方式吗?如果没有,能否请您推荐合适的?

#include <vector>
#include <cstdint>
#include <string>
#include <algorithm>
#include <iostream>
#include <sstream>

int main()
{
    std::vector<std::uint32_t> nums{3, 4, 2, 8, 15};
    std::stringstream list1;


    for (auto n : nums)
    {
        list1 << n<<",";
    }

    //Is this the right way to do using std::for_each so that above for loop can be done in 1 line??
    std::for_each(nums.begin(),nums.end(),[&list1](std::uint32_t n){ list1 << n << ","; });

}

是的,没错。以业绩为动机的(std::uint32_t &n)就不需要参考了

你为什么不直接测试一下呢?

auto vs std::for_each

如您所见,两者的程序集输出相同。这对您的示例没有任何影响。

如果您想将数据从一个事物复制到另一个事物,您可以使用 std::copy

int main()
{
    std::vector<std::uint32_t> nums{3, 4, 2, 8, 15};
    std::stringstream list1;

    std::copy(nums.begin(), nums.end(),std::ostream_iterator<std::uint32_t>(list1,","));
    std::cout << list1.str();
}

Live Example

这将以 , 结束流,但这与您在代码中得到的相同。

如果你不想要这个,那么你应该看看 Pretty-print C++ STL containers

是的,您对 for_each 的使用是对前面循环的合理模拟。

不过,我觉得有必要指出,我发现 for_each 可能是库中 最不 有用的算法。据我所见,使用它通常表明您基本上仍然思考 循环,只是更改用于这些循环的语法。我还认为基于范围的 for 循环可能已经消除了至少 90% 的(已经很少的)合法用途,这些用途曾经是 for_each.

在这种情况下,您的代码实际上是在模仿使用 std::copystd::ostream_iterator:

std::copy(nums.begin(), nums.end(), 
          std::ostream_iterator<std::uint32_t>(std::cout, ","));

然而,即使这样,也很笨拙,我认为它是否真的是基于范围的 for 循环的改进值得商榷。