矢量元素不会出现被contigously存储(vector elements do not appe

2019-10-17 09:07发布

为什么最后的期望输出从下面的代码的实际输出有什么不同?

#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';
}

Answer 1:

该标准不说&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] 这将是非常令人不快的行为。



Answer 2:

vector< vector< int > >不是一个二维阵列状int[5][5] 它的指针数组的数组。 (更确切地说,它包含的序列std::vector含有指向整数对象。)只有“行”是连续的。 不同的行是不连续的彼此,因为它们可被存储在存储器的不同malloc分配块。



Answer 3:

vector不存储其在连续的存储器元件。 但是的元素vector<vector<int>> twoDv; 是矢量,而不是整数,且整数被存储在连续的存储器内部, 每个矢量

想指针数组的:

int* x[10];

10指针存储在连续内存,但它们指向什么不必须在连续的内存。



文章来源: vector elements do not appear to be stored contigously
标签: c++ vector