1

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

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

3 回答 3

5

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

于 2012-11-12T09:39:46.493 回答
5

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

在此处输入图像描述

考虑一个指针数组:

int* x[10];

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

于 2012-11-12T09:41:11.563 回答
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]必须使迭代器和对另一个 vector 元素的引用无效twoDv[1]。这将是非常不受欢迎的行为。

于 2012-11-12T09:42:09.040 回答