多维向量和向量指针

时间:2013-11-09 02:39:47

标签: c++ pointers vector

我试图存储指向矢量中指向矢量的指针的指针。 (我希望这不是太令人难以置信)。基本上,我有一个向量,我想在其中存储多个矩阵,因此有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; *”

2 个答案:

答案 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;

错误完全与编译器描述的一样,是从int5是{到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语法。