📜  for_each c++ (1)

📅  最后修改于: 2023-12-03 15:00:50.171000             🧑  作者: Mango

C++中的for_each

在C++中,有一个非常方便的算法函数for_each,它可以遍历一个容器中的每个元素,并对每个元素执行一个给定的函数。这个函数可以是任何可调用对象,包括函数、函数指针、函数对象、lambda表达式等等。

使用方法

for_each函数的原型如下:

template <class InputIterator, class UnaryFunction>
UnaryFunction for_each (InputIterator first, InputIterator last, UnaryFunction f);

其中,参数first和last表示容器的一个范围,包括[first, last)之间的元素都会被遍历。参数f表示要执行的函数,它会对容器中的每个元素进行操作。

下面是一个简单的使用示例:

#include <iostream>
#include <vector>
#include <algorithm>

void print(int x) {
  std::cout << x << ' ';
}

int main() {
  std::vector<int> v { 0, 1, 2, 3, 4, 5 };
  std::for_each(v.begin(), v.end(), print); //输出 0 1 2 3 4 5
  std::cout << '\n';
}

在这个例子中,我们定义了一个函数print,用于输出一个数字。然后我们创建了一个vector容器,并将其元素遍历并输出。

lambda表达式

使用for_each函数时,我们通常会结合lambda表达式来使用,这可以方便我们快速定义一个函数对象。例如,上面的例子可以改写为:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
  std::vector<int> v { 0, 1, 2, 3, 4, 5 };
  std::for_each(v.begin(), v.end(), [](int x){ std::cout << x << ' '; }); //输出 0 1 2 3 4 5
  std::cout << '\n';
}

在这个例子中,我们使用了一个lambda表达式来定义一个函数对象,用于输出数字。这样可以避免为输出数字定义一个单独的函数,增加代码的复杂性。

例子

下面是一个更复杂的例子,可以更好地体现for_each函数的强大功能。这个例子实现了一个求和操作,将vector中的所有元素相加并输出。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
  std::vector<int> v { 0, 1, 2, 3, 4, 5 };
  int sum = 0;
  std::for_each(v.begin(), v.end(), [&](int x){ sum += x; }); // sum=15
  std::cout << "sum = " << sum << '\n';
}

在这个例子中,我们使用了一个lambda表达式来实现求和操作。在lambda表达式中,我们使用了捕获列表[&],它表示可以捕获所有的变量。这样,我们就可以在lambda表达式中直接使用变量sum,而无需通过参数传递。

总结

for_each函数是C++中非常方便的一个算法函数,它可以帮助我们快速遍历容器中的元素,并对每个元素执行一个操作。它还支持lambda表达式,可以方便地定义函数对象。在实际开发中,for_each函数可以大大减少我们的代码量,提高开发效率。