[英]multi-dimensional vectors and pointers to vectors
我正在尝试将指向矢量的指针存储在矢量中。 (我希望那不是太令人困惑了)。 基本上,我有一个向量,我想在其中存储多个矩阵,因此是3维。 我访问元素的方式似乎有问题。 我没有特别理解该错误,因为第3维是指向ints向量的指针。 我认为这不会改变您访问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 <int,std :: allocator <int>> *'的无效转换
matrixHolder[0]
的类型为vector<vector<int>*>*
,它是指向ints向量的指针的向量的指针。
matrixHolder[0][0]
取消引用matrixHolder[0]
,因此它的类型为vector<vector<int>*>
,它是一个指向ints向量的指针的向量。
matrixHolder[0][0][0]
获取matrixHolder[0][0][0]
的第一个元素, matrixHolder[0][0]
类型为vector<int>*
(指向ints向量的指针)。
因此,当您执行此操作时:
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;
但是,这可能会令人困惑,使您看起来好像拥有5维数组。
顺便说一句,你错了。 您不需要使用指针,但在这里我不会尝试说服您。
另一个注意事项:
a->push_back(new vector<int>(10, 0));
a
是未初始化的指针,您刚刚取消引用了它。 那是未定义的行为。
(有关更精心设计的解决方案...)
不要使用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语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.