如何解决我可以更快地将我的1D向量转换为2D向量吗?
问题很简单。经过一番试验,这是我发现的最有效的代码:
//For the sake of the example,I initialize every entry as zero.
vector<float> vector1D(1024 * 768,0);
vector<vector<float>> vector2D(768,vector<float>(1024,0));
int counter = 0;
for (int i = 0; i < 768; i++) {
for (int j = 0; j < 1024; j++) {
vector2D[i][j] = vector1D[counter++];
}
}
有更快的方法吗?
解决方法
是的
您可以重新映射访问元素的方式,而无需复制它们。您可以创建一个“视图”类来实现这一点:
template<typename T>
class two_dee_view
{
public:
two_dee_view(std::vector<T>& v,std::size_t row,std::size_t col)
: v(v),stride(col) { if(v.size() < row * col) v.resize(row * col); }
T& operator()(std::size_t row,std::size_t col)
{ return v[(row * stride) + col]; }
T const& operator()(std::size_t row,std::size_t col) const
{ return v[(row * stride) + col]; }
std::size_t col_size() const { return stride; }
std::size_t row_size() const { return v.size() / stride; }
private:
std::vector<T>& v;
std::size_t stride;
};
int main()
{
std::vector<double> v {1.0,2.0,3.0,4.0,5.0,6.0};
two_dee_view<double> v2d(v,2,3);
for(auto row = 0U; row < v2d.row_size(); ++row)
for(auto col = 0U; col < v2d.col_size(); ++col)
std::cout << row << "," << col << ": " << v2d(row,col) << '\n';
}
输出:
0,0: 1
0,1: 2
0,2: 3
1,0: 4
1,1: 5
1,2: 6
该类仅维护对传递给构造函数的std::vector
的引用。只要原始的two_dee_view
可以使用,就只能使用std::vector
,但是不再使用。
使用memcpy
可能会更快,因为这是用于复制内存的API的最低级别,并且可能存在编译器优化可能使用特定的指令等,并且使速度更快:
for (int i = 0; i < 768; i++) {
memcpy(vector2D[i].data(),&vector1D[i * 1024],sizeof(float) * 1024);
}
请记住,除了可复制的数据外,您不应该将memcpy
用于任何其他用途。也就是说,它对于float
和int
来说可以正常工作,但对于类而言则不能,因为不会调用复制构造函数。
如果由于某些原因必须使用向量向量,则使用memcpy
或memmove
会更快(因为这是一个步骤,如另一封回复所述)。但是您应该使用STL,而不要自己动手。
vector<float> vector1D(1024 * 768,0);
vector<vector<float>> vector2D(768,vector<float>(1024,0));
for (int i = 0; i < 768; i++) {
vector2D[i].assign(next(vector1D.cbegin(),1024 * i),next(vector1D.cbegin(),1024 * (i + 1)));
}
这会产生一个直接的memmove
(取决于STL的实现方式),但是更加安全,经过优化并且(可能)可读。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。