矢量矢量是连续的吗?

时间:2013-10-21 20:51:41

标签: c++ vector stl

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

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?

6 个答案:

答案 0 :(得分:15)

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

enter image description here

答案 1 :(得分:4)

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

在C ++(以及许多其他语言)中实现连续数组(通常是任何密集矩阵)的方法是使用 flat 数组并手动计算索引:

typedef std::vector<long> matrix_t;

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

...当然这应该被适当地封装到一个类中。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

没有。这些向量不会以某种方式相互通信,以便在将它们添加到父向量时实现一个大的连续存储空间。

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

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

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

答案 4 :(得分:0)

考虑到向量倾向于自动重新调整大小,我认为它不能连续。

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

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

答案 5 :(得分:0)

vector< vector < long> > data将保存指向vector<long>个对象的连续数组的指针。反过来,每一个都将保持指向long的连续数组的指针。但是如果你期望所有long在一起,就像long[10][20]一样,那么不,那不是它的工作方式。