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

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

最佳答案

标准没有说&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]的元素的引用无效。这将是非常不良的行为。

09-16 10:52