面试题答案
一键面试#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
中的向量元素的操作相互独立,适合并行处理。并行执行策略会将任务分割成多个子任务,分配到不同的线程中同时执行,从而加快整体的处理速度。但要注意,并行执行可能会带来额外的开销(如线程创建、同步等),所以在数据量较小时,并行执行不一定比顺序执行快。