指向包含两个向量的数组的指针

时间:2015-09-09 19:17:49

标签: c++ arrays pointers vector

我正在做一些我似乎无法再弄清楚自己的事情。我不知道怎么称呼这个问题。

vector<int> *integerVectors[2] = { new vector<int>, new vector<int>};
(*integerVectors)[0].push_back(1);
(*integerVectors)[1].push_back(1);

当我运行这个时,我得到一个未处理的例外。我想要的是一个带有2个索引的数组,每个索引都有一个向量。

编辑:当我开始推回时,问题似乎出现了。

2 个答案:

答案 0 :(得分:3)

这种语法:

MyType

创建一个指向大小为size vector<int> *integerVectors[2]; 的指针数组,这意味着:

integerVectors

生成一个大小为2的指向整数向量的指针数组,这个事实可以通过初始化new来初始化(*integerVectors) ,该初始化程序指向由push_back调用产生的整数向量的指针。

这样:

integerVectors[i]->push_back(1);

生成指向第一个向量指针的指针。然后在其上调用operator [],它通过向量的大小来偏移指针。但是这不再是指向数组的指针 - 如果你用大于0的参数调用它,你将引用第一个向量元素指向的虚拟向量旁边的虚构向量。

然后你在假想向量上调用vector<vector<int>*> integerVectors = {new vector<int>, new vector<int>}; integerVectors[1]->push_back(1); ,自然会在运行时导致大量问题。

你想要在解除引用之前进行偏移,就像@ Abstraction建议

一样
vector<vector<int>> integerVectors = {vector<int>{}, vector<int>{}};
integerVectors[1].push_back(1);

或者你想避免使用C风格的数组。你已经使用了一个向量,并且嵌套它们而不是制作它们的数组将在未来避免这种类型的混淆,同时保留正确的语法:

vector<vector<int>> integerVectors(2);
vector<vector<int>> integerVectors{{},{}};
vector<vector<int>> integerVectors(2, vector<int>{});
vector<vector<int>> integerVectors(2, {});

如果没有c风格的数组,您需要的语法会更加清晰。

更好的是,你可以完全避免指针并使用

vector<vector<int>> integerVectors = {{1,2,3},{1,2,3}};
vector<vector<int>> integerVectors{{1,2,3},{1,2,3}};
vector<vector<int>> integerVectors(2, vector<int>{1,2,3});
vector<vector<int>> integerVectors(2, {1,2,3});

@NeilKirk指出,其第一行有一些等效的语法:

{{1}}

我在初始化时使用的花括号是另一种初始化对象的方法,而不会让编译器将它混淆为最烦恼的解析中的函数。 (但是,您必须小心处理可以使用初始化程序列表初始化的内容,这就是为什么这些初始化中的一些使用括号,而不是)第一种语法默认初始化两个向量,第二种也是如此,它明确地陈述了同样的事情。它也可以被修改以产生更复杂的结构:两个带有元素{1,2,3}的向量可以是以下之一:

{{1}}

答案 1 :(得分:2)

这一行是问题

(*integerVectors)[1].push_back(1);

解除引用*integerVectors会给你第一个向量指针(相当于integerVectors[0]。然后你用1调用你调用operator []作为这个指针的参数,它将引用向量地址向前移动一个向量大小向前(相当于*(integerVectors[0]+1)),这是无效的。 正确的语法是

 integerVectors[1]->push_back(1);