我需要分配一个行向量,其中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?
答案 0 :(得分:15)
简而言之,没有。这就是实际发生的事情:
答案 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)
没有。这些向量不会以某种方式相互通信,以便在将它们添加到父向量时实现一个大的连续存储空间。
在这种情况下,根据规范,用于firstRow
和secondRow
实例的存储是连续的。但是,向量使用堆存储作为其元素,并且非常(非常)不太可能两个子向量巧合地共享一个块用于它们各自的分配。
不要将您的元素(向量)与您的元素单独分配混淆。这些分配很重要,在这种情况下,你将跳过遍历它们的内存。从数据位置的角度来看,向量向量不是一个好主意。
想要一大块内存吗?使用数组。
答案 4 :(得分:0)
考虑到向量倾向于自动重新调整大小,我认为它不能连续。
当然,对向量的引用可能是连续的,但数据本身并不是全部。
如果矢量矢量是连续的,那么各个矢量将如何重新调整自身的大小?
答案 5 :(得分:0)
vector< vector < long> > data
将保存指向vector<long>
个对象的连续数组的指针。反过来,每一个都将保持指向long
的连续数组的指针。但是如果你期望所有long
在一起,就像long[10][20]
一样,那么不,那不是它的工作方式。