向量元素似乎不是连续存储的

时间:2012-11-12 09:35:41

标签: c++ vector

为什么最后一个预期输出与以下代码中的实际输出不同?

#include<iostream>
#include<fstream>
#include<istream>
#include<sstream>
#include<vector>

using namespace std;


int main()
{
        vector<int> v;
        for(int ii = 0; ii < 4; ii++){
            v.push_back(0);
        }

        vector<vector<int>> twoDv;

        for(int ii = 0; ii < 5; ii++){
            twoDv.push_back(v);
        }

        cout<<"Expected Output : " << &twoDv[0][0] <<'\t'<< (&twoDv[0][0] + 3) <<'\t'<< (&twoDv[0][3] + 1)<<'\n';
        cout<<"Actual Output   : " << &twoDv[0][0] <<'\t'<< &twoDv[0][3] <<'\t'<< &twoDv[1][0] << '\n';
}

3 个答案:

答案 0 :(得分:5)

vector< vector< int > >不是像int[5][5]这样的二维数组。它是一个指向数组的指针数组。 (更确切地说,它包含一系列包含整数指针的std::vector个对象。) 只有“行”是连续的。不同的行彼此不是连续的,因为它们可能存储在不同的malloc'ed内存块中。

答案 1 :(得分:5)

vector会将其元素存储在连续内存中。但是vector<vector<int>> twoDv;的元素是向量,而不是整数,并且int在内部存储在连续内存中,每个向量

enter image description here

想想一个指针数组:

int* x[10];

10指针存储在连续内存中,但它们指向的指针不必存在于连续内存中。

答案 2 :(得分:2)

标准并未说明&twoDv[1][0]等于&twoDv[0][3] + 1。它表示&twoDv[1]等于&twoDv[0] + 1,而&twoDv[0][1]等于&twoDv[0][0] + 1

假设&twoDv[1][0] 等于&twoDv[0][3] + 1,然后你做twoDv[0].resize(5);。突然我们发生了冲突,&twoDv[0][3] + 1不能是&twoDv[1][0]的地址, &twoDv[0][4]的地址。因此twoDv[0]上的调整大小操作必须使迭代器和对另一个向量twoDv[1]的元素的引用无效。这将是非常不受欢迎的行为。