两者都可用于将函数应用于一系列元素。
在高层次上:
std::for_each
忽略函数的返回值,并且 保证执行顺序。std::transform
将返回值分配给迭代器,并执行 不保证执行顺序。
您更喜欢在什么时候使用其中一个而不是另一个?有什么微妙的警告吗?
最佳答案
std::transform
与 map
相同。这个想法是对两个迭代器之间的每个元素应用一个函数,并获得一个由应用这种函数产生的元素组成的不同容器。您可能希望将其用于例如将对象的数据成员投影到新容器中。在下面,std::transform
用于在 std::size_t
s 的容器中转换 std::string
s 的容器.
std::vector<std::string> names = {"hi", "test", "foo"};
std::vector<std::size_t> name_sizes;
std::transform(names.begin(), names.end(), std::back_inserter(name_sizes), [](const std::string& name) { return name.size();});
另一方面,您执行 std::for_each
只是为了产生副作用。换句话说,std::for_each
非常类似于普通的基于范围的 for
循环。
回到字符串示例:
std::for_each(name_sizes.begin(), name_sizes.end(), [](std::size_t name_size) {
std::cout << name_size << std::endl;
});
确实,从 C++11 开始,同样可以使用基于范围的 for
循环使用更简洁的符号来实现:
for (std::size_t name_size: name_sizes) {
std::cout << name_size << std::endl;
}
关于c++ - std::transform 和 std::for_each 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31064749/