c++ - std::transform 和 std::for_each 有什么区别?

标签 c++ c++11 stl-algorithm

两者都可用于将函数应用于一系列元素。

在高层次上:

  • std::for_each 忽略函数的返回值,并且 保证执行顺序。
  • std::transform 将返回值分配给迭代器,并执行 不保证执行顺序。

您更喜欢在什么时候使用其中一个而不是另一个?有什么微妙的警告吗?

最佳答案

std::transformmap 相同。这个想法是对两个迭代器之间的每个元素应用一个函数,并获得一个由应用这种函数产生的元素组成的不同容器。您可能希望将其用于例如将对象的数据成员投影到新容器中。在下面,std::transform 用于在 std::size_ts 的容器中转换 std::strings 的容器.

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/

相关文章:

c++ - 使用 for_each 和 bind 反转 vector 中的字符串

c++ - 看不到 SpotLight - OpenGL

c++ - 存取错误的问题(下方附有程式码)

c++ - 如何在 C++11 (STL) 中创建一个压缩两个元组的函数?

C++使用自动与定义的迭代器

c++ - 如何绑定(bind)一个容器中的元素以调用另一个容器中的成员函数

algorithm - 使用 STL 运行长度使用 std::adjacent_find 对字符串进行编码

c++ - 使用 CMake,为什么某些第三方库会自动让您查看其包含目录,而其他库则不会?

C++ OpenGL, GLFW 绘制一个简单的立方体

c++ - 英特尔 C++ 编译器编译递归 decltype 返回的速度非常慢