在构造函数中逐值初始化一个成员vector<vector<int>>

Initializing a member vector<vector<int>> in the constructor value-by-value

我有一个 class 应该生成我想用作地图(称为矩阵)的二维整数向量(在 0-1 范围内)。

    class generator
    {
    public:
        void draw(void);
        void iterate(void);
        generator();
        ~generator();
    private:
        vector<vector<int>> matrix;
    };

在构造函数中我想用随机数据填充矩阵:

vector<vector<int>> matrix(height, vector<int>(width));
for (int i = 0; i < height; i++){
    for (int j = 0; j < width; j++) {
        matrix[i][j] = rand() % 2;
    }
}

但是我遇到了读取访问冲突。 感谢您的时间和精力。

弃用的更新: 我尝试使用成员函数 .data() 来检索指向数据的指针并直接访问它

ptr = matrix[i][j].data();
*ptr = rand() % 2;

但结果并没有什么不同。我相当确信这不是我想如何访问矢量而是我如何设置它。

更新 2:

下面提供的更正确实导致矢量按预期填充。当试图

cout << matrix[i][j];

在 draw 成员函数中,我再次遇到读取访问冲突。

更新 3:

按照建议,我检查了这个错误发生的确切时间。它发生在第一次尝试打印出矩阵 [0][0] 处的第一个整数时。返回值为 0x8。重要提示:如果不替换为常数 matrix.size() 已经导致错误。

更新 4:

这基本上是我的画法()

void generator::draw() {
    for (int i = 0; i < matrix.size(); i++) {
        for (int j = 0; j < matrix[i].size(); j++) {
            cout << matrix[i][j];
        }
        cout << endl;
    }
}

原始来源已更新以反映当前来源。

更新 4: 在 http://pastebin.com/83vrDJWZ

略微删减了源代码

更新 5: 我的一个更简单的错误已在评论中得到解决。问题解决了。谢谢大家

看起来问题是指针无效,原因是:

vector<vector<int>*> matrix;

您有一个指向 int 向量的指针向量,但您从未实际分配内部元素。

改为使用:

vector<vector<int>> matrix;

并且在初始化步骤中:

matrix[i].resize(width); // instead of: matrix[i]->resize(width);

其实,你可以稍微简化一下:

std::vector<std::vector<int>> matrix(height, std::vector<int>(width));

不过仍然需要迭代来填充数据。