我正在做一些我似乎无法再弄清楚自己的事情。我不知道怎么称呼这个问题。
vector<int> *integerVectors[2] = { new vector<int>, new vector<int>};
(*integerVectors)[0].push_back(1);
(*integerVectors)[1].push_back(1);
当我运行这个时,我得到一个未处理的例外。我想要的是一个带有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);