2

我需要分配一个行向量,其中行包含一个行向量。我知道向量是连续的。我想知道向量的向量是否也是连续的。示例代码如下

vector<long> firstRow;

firstRow.push_back(0);

firstRow.push_back(1);

vector<long> secondRow;

secondRow.push_back(0);

secondRow.push_back(1); 

vector< vector < long> > data;

data.push_back(firstRow);

data.push_back(secondRow);

内存中的序列会是 0 1 0 1 吗?

4

6 回答 6

19

简而言之,没有。这就是实际发生的情况:

在此处输入图像描述

于 2013-10-21T21:03:09.363 回答
5

正如其他人所说,不:嵌套向量不是连续的(顺便说一下,嵌套数组是相同的;静态大小的数组是一个例外)。

在 C++(和许多其他语言)中实现连续数组数组(通常是任何密集矩阵)的方法是拥有一个平面数组并手动计算索引:

typedef std::vector<long> matrix_t;

matrix_t M(width * height);
// Assign to index i, j:
M[i + j * width] = value;

……当然,这应该适当地封装到一个类中。

于 2013-10-21T21:00:20.843 回答
3

不,boost::multi_array<long, 2>改用。

于 2013-10-21T21:03:57.390 回答
1

不可以。当向量被添加到父向量时,它们不会以某种方式相互通信以实现一个大的、连续的存储空间。

在这种情况下,根据规范,用于 和 的实例的存储firstRow是连续的。secondRow但是,向量对其元素使用堆存储,并且两个子向量非常(非常)不可能巧合地为它们各自的分配共享一个块。

不要将您的元素(向量)与您的元素单独分配混淆。重要的是这些分配,在这种情况下,您将在内存中跳跃遍历它们。从数据局部性的角度来看,向量的向量不是一个好主意。

想要一大块内存?使用数组。

于 2013-10-21T20:54:20.920 回答
0

考虑到向量往往会自动调整大小,我认为它不能是连续的。

当然,对向量的引用可能是连续的,但数据本身不能都是连续的。

如果向量的向量是连续的,那么各个向量如何重新调整自己的大小?

于 2013-10-21T20:54:06.157 回答
0

vector< vector < long> > data将持有一个指向连续vector<long>对象数组的指针。反过来,其中的每一个都将持有一个指向连续数组的指针long。但是,如果您期望所有longs 在一起,就像 s 的情况一样long[10][20],那么不,这不是它的工作原理。

于 2013-10-21T20:55:49.727 回答