将 '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)
就不需要参考了
你为什么不直接测试一下呢?
如您所见,两者的程序集输出相同。这对您的示例没有任何影响。
如果您想将数据从一个事物复制到另一个事物,您可以使用 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();
}
这将以 ,
结束流,但这与您在代码中得到的相同。
如果你不想要这个,那么你应该看看 Pretty-print C++ STL containers
是的,您对 for_each
的使用是对前面循环的合理模拟。
不过,我觉得有必要指出,我发现 for_each
可能是库中 最不 有用的算法。据我所见,使用它通常表明您基本上仍然思考 循环,只是更改用于这些循环的语法。我还认为基于范围的 for
循环可能已经消除了至少 90% 的(已经很少的)合法用途,这些用途曾经是 for_each
.
在这种情况下,您的代码实际上是在模仿使用 std::copy
和 std::ostream_iterator
:
std::copy(nums.begin(), nums.end(),
std::ostream_iterator<std::uint32_t>(std::cout, ","));
然而,即使这样,也很笨拙,我认为它是否真的是基于范围的 for
循环的改进值得商榷。
我在下面的代码中有一个 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)
就不需要参考了
你为什么不直接测试一下呢?
如您所见,两者的程序集输出相同。这对您的示例没有任何影响。
如果您想将数据从一个事物复制到另一个事物,您可以使用 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();
}
这将以 ,
结束流,但这与您在代码中得到的相同。
如果你不想要这个,那么你应该看看 Pretty-print C++ STL containers
是的,您对 for_each
的使用是对前面循环的合理模拟。
不过,我觉得有必要指出,我发现 for_each
可能是库中 最不 有用的算法。据我所见,使用它通常表明您基本上仍然思考 循环,只是更改用于这些循环的语法。我还认为基于范围的 for
循环可能已经消除了至少 90% 的(已经很少的)合法用途,这些用途曾经是 for_each
.
在这种情况下,您的代码实际上是在模仿使用 std::copy
和 std::ostream_iterator
:
std::copy(nums.begin(), nums.end(),
std::ostream_iterator<std::uint32_t>(std::cout, ","));
然而,即使这样,也很笨拙,我认为它是否真的是基于范围的 for
循环的改进值得商榷。