📜  C++ 17中的for_each_n

📅  最后修改于: 2021-05-30 18:53:35             🧑  作者: Mango

在C++ 17技术规范中添加了for_each_n ()函数。它的想法是从在PythonHaskel中使用map借来的。可以在有或没有执行策略的情况下调用此函数。执行策略使您可以决定是利用为并行化而优化的新并行化功能,以在多个内核上运行,还是简单地按照以前的标准依次运行它。甚至忽略执行策略,因为所有功能都有按顺序运行的重载对应功能。

简而言之,for_each_n()有助于将通用函数应用于数组的所有元素(或任何其他线性数据类型)。从本质上讲,它从给定的迭代器开始批量更新一系列元素,并从该迭代器中为固定数量的元素进行更新。

句法:

InputIt for_each_n( ExecutionPolicy&& policy,
           InputIt first, Size n, UnaryFunction f )

policy: [Optional] The execution policy to use.
The function is overloaded without its use.
first: The iterator to the first element 
you want to apply the operation on.
n: the number of elements to apply the function to.
f: the function object that is applied to the elements.  

(注意:给定的代码需要C++ 17或更高版本,并且可能无法在所有C++ 17环境中运行。)

// Requires C++17 or 17+
// C++ program to demonstrate the use for_each_n
// using function pointers as lambda expressions.
#include 
using namespace std;
  
/* Helper function to modify each element */
int add1(int x)
{
    return (x + 2);
}
  
int main()
{
    vector arr({ 1, 2, 3, 4, 5, 6 });
  
    // The initial vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
  
    // Using function pointer as third parameter
    for_each_n(arr.begin(), 2, add1);
  
    // Print the modified vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
  
    // Using lambda expression as third parameter
    for_each_n(arr.begin() + 2, 2, [](auto& x) { x += 2; });
  
    // Print the modified vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
  
    return 0;
}

输出:

1 2 3 4 5 6
2 3 3 4 5 6
2 3 5 6 5 6

for_each_n ()的真正功能和灵活性只能通过使用仿函数作为其第三个参数来加以利用。

(注意:给定的代码需要C++ 17或更高版本,并且可能无法在所有C++ 17环境中运行。)

// Requires C++17 or 17+
// A C++ program to demonstrate the use for_each_n
// using funcctors.
#include 
using namespace std;
  
// A Functor
class add_del {
private:
    int n;
  
public:
    increment(int _n)
        : n(_n)
    {
    }
  
    // overloading () to create Functor objects
    int operator()(int delta) const
    {
        return n + delta;
    }
};
  
int main()
{
    vector arr({ 1, 2, 3, 4, 5, 6 });
  
    // The initial vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
  
    // Using functor as third parameter
    for_each_n(arr.begin(), 2, add_del(1));
    for_each_n(arr.begin() + 2, 2, add_del(2));
  
    // Print the modified vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
  
    return 0;
}

输出:

1 2 3 4 5 6
2 3 5 6 5 6
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”