gpt4 book ai didi

c++ - vector vector 的快速分配

转载 作者:行者123 更新时间:2023-11-28 05:19:52 25 4
gpt4 key购买 nike

我将 3D 数据存储在基于 std::vector 的结构中:

std::shared_ptr< std::vector< std::vector< std::vector< Type > > > > data;

我在遍历 vector 时通过调用 resize 来分配这个结构:

    arraydata.reset(new std::vector< std::vector< std::vector< Type > > >());
arraydata->resize(m_width);
for (unsigned int col_index = 0; col_index < m_width; ++col_index)
{
(*arraydata)[col_index].resize(m_height);
for (unsigned int line_index = 0; line_index < m_height; ++line_index)
{
(*arraydata)[col_index][line_index].resize(m_nbbands);
}
}

但是当维度很大时,这种分配会花费很多时间......

有没有办法在单个操作中分配所有需要的空间(例如 malloc(m_width*m_height*m_nbbands*sizeof(Type))),然后在全局空间中为每个 vector 分配其自己的数据空间?它会更高效吗?


编辑:我测试了@justin-time 的想法

    arraydata.reset(new std::vector< std::vector< std::vector< T > > >(m_width,
std::vector< std::vector< T > >(m_height, std::vector< T > (m_nbbands))));

提供与原始代码相当的执行时间,大约 分配 4.9 秒,释放大约 40 秒 ???

这可以在内存管理器中看到: enter image description here

我没有成功测试来自 malloc 的分配,此代码在 std::vector< T > tmp(datptr, (T*)(datptr+arraySize)); 处失败

    unsigned int arraySize = m_nbbands*sizeof(T);
T *datptr = (T*)malloc(m_width*m_height*arraySize);

arraydata.reset(new std::vector< std::vector< std::vector< T > > >(m_width));
for (unsigned int col_index = 0; col_index < m_width; ++col_index)
{
(*arraydata)[col_index].resize(m_height);
for (unsigned int line_index = 0; line_index < m_height; ++line_index)
{
std::vector< T > tmp(datptr, (T*)(datptr+arraySize));
(*arraydata)[col_index][line_index].swap(tmp);

// also tested with same results:
//(*arraydata)[col_index][line_index] =
// std::vector< T >(datptr, (T*)(datptr+arraySize));

datptr += arraySize;
}
}

最佳答案

不要使用 vector 的 vector 。使用具有内部数组的类,然后提供一种访问元素的方法。例如:

template <typename T>
class vec3d {
std::vector<T> data;
size_t xmax, ymax, zmax;
public:
T& operator()(size_t x, size_t y, size_t z)
{ return data[x+y*xmax+z*xmax*ymax]; }
const T& operator()(size_t x, size_t y, size_t z)
{ return data[x+y*xmax+z*xmax*ymax]; }
vec3d(size_t x, size_t y, size_t z)
: xmax(x), ymax(y), zmax(z), data(x*y*z) {}
T& v(size_t x, size_t y, size_t z) { return (*this)(x,y,z); }
};

然后访问就像

 shared_ptr<vec3d<int>> p = make_shared<vec3d<int>>(10, 20, 30);
p->v(5,6,7) = 14;

或者 vec3d vec(5,6,7); vec(1,2,4) = 16.0f;//Fortran 风格的索引。

您可能需要更多成员以允许迭代、维度等。因为这是单个分配,所以它会很多更快。

关于c++ - vector vector 的快速分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41747100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com