我想将std::vector<std::vector<float>>
转换为std::vector<float2>
。直接的方式是这样的:
std::vector<std::vector<float>> pts;
std::vector<float> p1{1.,2.};
std::vector<float> p2{2.,3.};
pts.push_back(p1);
pts.push_back(p2);
std::vector<float2> lattice;
for (auto p : pts){
p_ = make_float2(p[0],p[1]);
lattice.push_back(p_);
}
这里float2
是cuda矢量类型,它是这样定义的(不是100%肯定):
struct __device_builtin__ __align__(8) float2
{
float x, y ;
};
还有其他快速方法吗?
答案 0 :(得分:3)
你可以做几件事。 1使用的类型意味着你知道总会有2个元素,例如:
std::vector<std::array<float, 2>>
或
std::vector<std::pair<float, float>>
这意味着在创建安全代码的每个点之前,您不需要检查内部向量是否正确。
其次,在开始emplacing back之前,在格子向量中保留适量的空间,这意味着您将永远不必调整大小并且不会浪费时间复制:
std::vector<float2> lattice;
lattice.reserve(pts.size());
for (auto p : pts){
lattice.emplace_back(make_float2(p[0],p[1]));
}
注意,这要求float2
结构支持移动(它将基于提供的定义)。
如果对这两种方法进行测试as done here.您将看到可以大大减少所需的时间。在链接的示例中,超过10000点,时间大约是原始时间的1/5,而我的建议更改。