0

我正在尝试将指向向量的指针存储在向量中。(我希望这不会太令人难以置信)。基本上,我有一个向量,我想在其中存储多个矩阵,因此是 3 维。我访问元素的方式似乎有问题。我并不特别理解这个错误,因为第三维是一个指向整数向量的指针。我认为这不会改变您访问整数的方式。

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> >*'的无效转换</p>

4

2 回答 2

3

matrixHolder[0]是 类型vector<vector<int>*>*,一个指向一个向量的指针,该指针指向一个整数向量。

matrixHolder[0][0]dereferences matrixHolder[0],所以它是 type vector<vector<int>*>,一个指向 int 向量的指针向量。

matrixHolder[0][0][0]获取 的第一个元素matrixHolder[0][0],类型为vector<int>*,一个指向整数向量的指针。

所以当你这样做时:

matrixHolder[0][0][0] = 5;

int该错误与您的编译器所描述的完全一样,从(that's what 5is) 到vector<int>*(that's what matrixHolder[0][0][0]is)的无效转换

这种可怕可憎的正确语法是:

(*(*matrixHolder[0])[0])[0] = 5;

或者你也可以这样做:

matrixHolder[0][0][0][0][0] = 5;

但这可能会令人困惑,因为它看起来像你有一个 5 维数组。

顺便说一句,你错了。你不需要使用指针,但我不会在这里试图说服你。

另一个注意事项:

a->push_back(new vector<int>(10, 0));

a是一个未初始化的指针,你只是取消了它的引用。那是未定义的行为。

于 2013-11-09T02:53:29.157 回答
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 语法。

于 2013-11-09T03:01:14.537 回答