我试图存储指向矢量中指向矢量的指针的指针。 (我希望这不是太令人难以置信)。基本上,我有一个向量,我想在其中存储多个矩阵,因此有3个维度。我访问元素的方式似乎有问题。我没有特别理解错误,因为第三维是指向int的向量的指针。我认为这不应该改变你访问整数的方式。
using namespace std;
vector< vector< vector<int>* >* > matrixHolder;
int main() {
vector< vector<int>* >* a;
a->push_back(new vector<int>(10, 0));
matrixHolder.push_back(a);
matrixHolder[0][0][0] = 5; //Line 34
return 0;
}
main.cpp:34:错误:无效转换为'int'到'std :: vector&lt; int,std :: allocator&lt; INT&GT; &GT; *”
答案 0 :(得分:3)
matrixHolder[0]
的类型为vector<vector<int>*>*
,指向指向int的向量的指针向量。
matrixHolder[0][0]
取消引用matrixHolder[0]
,因此它的类型为vector<vector<int>*>
,是指向整数向量的指针向量。
matrixHolder[0][0][0]
获取matrixHolder[0][0]
的第一个元素,类型为vector<int>*
,是指向int的向量的指针。
所以当你这样做时:
matrixHolder[0][0][0] = 5;
错误完全与编译器描述的一样,是从int
(5
是{到vector<int>*
)到matrixHolder[0][0][0]
的无效转换(这就是(*(*matrixHolder[0])[0])[0] = 5;
)
这种可怕的憎恶的正确语法是:
matrixHolder[0][0][0][0][0] = 5;
或者您也可以这样做:
a->push_back(new vector<int>(10, 0));
但这可能令人困惑,因为它看起来像你有一个5维阵列。
顺便说一句,你错了。你不需要使用指针,但我不会试图在这里说服你。
另一个注意事项:
a
{{1}}是一个未初始化的指针,你刚刚取消引用它。这是未定义的行为。
答案 1 :(得分:0)
(对于更精心设计的解决方案......)
不要使用vector<vector<T>>
来存储矩阵。通常的解决方案是单个数组(例如,vector<T>
),使用简单的算法来计算偏移量(x + width * y
用于行主要存储空间):
int main() {
constexpr int w = 10, h = 10;
vector<vector<int>> matrixHolder(1, vector<int>(w * h, 0));
int x = 2, y = 3;
matrixHolder[0][x + w * y] = 5;
}
对不起C ++ 11语法。