有没有快速的方法来转换std :: vector <std :: vector <float>&gt;到std :: vector <float2>?

时间:2018-01-17 01:54:02

标签: c++ c++11 vector stl

我想将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 ;
};

还有其他快速方法吗?

1 个答案:

答案 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,而我的建议更改。