我正在使用多线程并想要合并结果.例如:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Run Code Online (Sandbox Code Playgroud)
我希望AB按顺序拥有A的内容和B的内容.做这样的事情最有效的方法是什么?
假设我有
std::vector<T1> vec1 {/* filled with T1's */};
std::vector<T2> vec2 {/* filled with T2's */};
Run Code Online (Sandbox Code Playgroud)
以及一些T1 f(T2)当然可以成为lambda的功能.连接vec1和vec2应用于f每个T2中的最佳方法是什么vec2?
显而易见的解决方案是std::transform,即
vec1.reserve(vec1.size() + vec2.size());
std::transform(vec2.begin(), vec2.end(), std::back_inserter(vec1), f);
Run Code Online (Sandbox Code Playgroud)
但我说这不是最佳的,因为std::back_inserter必须对每个插入的元素进行不必要的容量检查.什么是最优的是类似的东西
vec1.insert(vec1.end(), vec2.begin(), vec2.end(), f);
Run Code Online (Sandbox Code Playgroud)
这可能会导致单一容量检查.遗憾的是,这不是有效的C++.本质上,这是一样的道理,为什么std::vector::insert是最佳的载体串联,看到这个问题,并在评论这对于在这一点上进一步讨论的问题.
所以:
std::transform使用STL的最佳方法是什么?insert将上述功能排除在STL之外?UPDATE
我已经开始验证多个容量检查是否确实有任何明显的成本.为此,我基本上只将id函数(f(x) = x)传递给答案中讨论的std::transform和push_back方法.完整的代码是:
#include <iostream>
#include <vector>
#include …Run Code Online (Sandbox Code Playgroud)