繁体   English   中英

多维向量和向量指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM