如果您的存储空间的大小提前知道,请不要使用嵌套向量,也就是说,例如第一个索引的大小必须为 6,并且永远不会改变是有特定原因的。只需使用普通数组。更好的是,使用. 这样,您将获得拥有一个普通数组的所有好处(当您使用多维时可以节省大量空间),以及拥有一个真实对象实例化的好处。boost::array
如果您的存储必须是矩形的,请不要使用嵌套向量,即您可以调整一个或多个维度的大小,但每个“行”在某些时候必须具有相同的长度。使用. 这样,您可以记录“这个存储是矩形的”,节省大量空间,并且仍然可以调整大小,拥有真实对象的好处等。boost::multi_array
问题std::vector
在于它 (a) 是可调整大小的,并且 (b) 丝毫不关心它的内容,只要它们是正确的类型。这意味着,如果您有vector<vector<int> >
,那么所有“行向量”都必须维护它们自己的单独簿记信息,了解它们的长度——即使您想强制它们的长度相同。这也意味着它们都管理单独的内存分配,这会损害性能(缓存行为),并且由于如何std::vector
重新分配而浪费更多空间。boost::multi_array
设计时期望您可能想要调整它的大小,但不会通过在末尾附加元素(行,对于二维数组/面,对于 3 维数组/等)来不断调整它的大小。std::vector
旨在(可能)浪费空间以确保操作不慢。boost::multi_array
旨在节省空间并将所有内容整齐地组织在内存中。
那说:
是的,您确实需要做一些事情才能索引到向量中。std::vector
不会神奇地导致索引突然出现,因为你想在那里存储一些东西。但是,这很容易处理:
您可以首先使用适当数量的零默认初始化向量,然后使用(size_t n, const T& value = T())
构造函数替换它们。那是,
std::vector<int> foo(10); // makes a vector of 10 ints, each of which is 0
因为“默认构造”的 int 的值为 0。
在您的情况下,我们需要通过创建具有适当大小的子向量并让构造函数复制它们来指定每个维度的大小。这看起来像:
typedef vector<float> d1;
typedef vector<d1> d2;
typedef vector<d2> d3;
typedef vector<d3> d4;
d4 result(2, d3(7, d2(480, d1(31))));
即d1
构造一个大小为31的unnamed,用于初始化default d2
,用于初始化default d3
,用于初始化result
。
还有其他方法,但是如果您只想从一堆零开始,它们会更加笨拙。但是,如果您要从文件中读取整个数据集: