MST

星途 面试题库

面试题:C++中transform结合并行算法与复杂数据转换

假设有一个非常大的std::vector<std::pair<int, std::vector<double>>>,其中每个pair的第一个元素代表一个ID,第二个元素是一个包含若干浮点数的向量。使用C++ STL的transform算法结合并行执行策略,对每个pair中的向量元素进行如下操作:如果向量元素的数量是偶数,则将每个元素平方;如果数量是奇数,则将每个元素开平方根。并且在处理完成后,将所有ID值大于100的pair存储到另一个新的向量中。请写出高效且完整的C++代码实现,包括必要的头文件、命名空间声明以及对并行策略选择的简要说明。
35.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>
#include <utility>
#include <cmath>
#include <algorithm>
#include <execution>

using namespace std;

int main() {
    // 假设这个大的向量
    vector<pair<int, vector<double>>> largeVector;
    // 这里省略对largeVector的初始化

    // 新的向量用于存储ID值大于100的pair
    vector<pair<int, vector<double>>> newVector;

    // 使用并行执行策略transform对每个pair中的向量元素进行操作
    transform(execution::par, largeVector.begin(), largeVector.end(), back_inserter(newVector),
              [](const pair<int, vector<double>>& p) {
                  pair<int, vector<double>> result = p;
                  if (result.second.size() % 2 == 0) {
                      transform(result.second.begin(), result.second.end(), result.second.begin(),
                                [](double num) { return num * num; });
                  } else {
                      transform(result.second.begin(), result.second.end(), result.second.begin(),
                                [](double num) { return sqrt(num); });
                  }
                  return result;
              });

    // 移除ID值小于等于100的元素
    newVector.erase(remove_if(newVector.begin(), newVector.end(),
                              [](const pair<int, vector<double>>& p) { return p.first <= 100; }),
                    newVector.end());

    return 0;
}

并行策略选择简要说明

在上述代码中,使用execution::par作为transform算法的执行策略,它表示并行执行。这在处理非常大的std::vector<std::pair<int, std::vector<double>>>时,能充分利用多核CPU的优势,提高处理效率。因为每个pair中的向量元素的操作相互独立,适合并行处理。并行执行策略会将任务分割成多个子任务,分配到不同的线程中同时执行,从而加快整体的处理速度。但要注意,并行执行可能会带来额外的开销(如线程创建、同步等),所以在数据量较小时,并行执行不一定比顺序执行快。