有没有简单的方法来动态增加 boost::multi_array 维度?

Posted

技术标签:

【中文标题】有没有简单的方法来动态增加 boost::multi_array 维度?【英文标题】:Are there easy ways of increasing boost::multi_array dimension dynamically? 【发布时间】:2013-07-23 09:52:34 【问题描述】:

MultiArray in boost 与使用 std::vector 创建多数组相比有很多优势。但是,我对 BOOST 中的 MultiArray 感到不舒服的一件事是,创建一个可以轻松更改其大小的多数组并不容易。我有以下代码来说明我的观点:

vector<vector<int> > my_2d_array;
vector<int> temp;
temp.push_back(3);
temp.push_back(4);
my_2d_array.push_back(temp);
temp.clear;
temp.push_back(4);
temp.push_back(5);
my_2d_array.push_back(temp);
temp.clear;
temp.push_back(41);
temp.push_back(51);
my_2d_array.push_back(temp);

从上面的代码可以看出,使用vector&lt;vector&lt;int&gt; &gt;数据结构,我们可以很容易的增加多数组的维数。但是使用 boost::multi_array,你必须在使用之前使用boost::extents 来确定多数组的维度。我想知道 boost::multi_array 是否也有一种简单的方法来增加它的维度,就像上面代码中的 vector&lt;vector&lt;int&gt; &gt; 所做的那样。

【问题讨论】:

我认为名字是reshaping,是的,IIRC 有它 最大的区别是boost::multi_array 是一个连续的内存块,而std::vector&lt;std::vector&lt;int&gt;&gt; 只有内部向量是连续的。两者之间存在权衡。 【参考方案1】:
myarray.reshape(extents[newSizeY][newSizeX]);

有效。顺便说一句,你不能做类似的事情

boost::multi_array<int,2> foo;
// Reshape first before the following call
foo = some_function_that_returns_multi_array()

这已经让我好几次了。你必须重塑

使用 multi_array 的优点是数据存储在一个连续的块中,这有助于更好地缓存局部性,但在“真实世界”测试中,我注意到您仍然可以使用简单的 std 获得显着的性能改进::array 有时,但 YMMV

【讨论】:

以上是关于有没有简单的方法来动态增加 boost::multi_array 维度?的主要内容,如果未能解决你的问题,请参考以下文章

list遍历陷阱分析原理

JQUERY方法给TABLE动态增加行

有没有一种简单的方法可以在 Django 管理站点中创建链式动态下拉列表?

spring能动态给一个类增加一个方法或属性吗

jQuery学习笔记 .addClass()/.removeClass()简单学习

GroovyMOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )