初始化成员向量<vector <int>&gt;在构造函数中的value-by-value

时间:2015-12-25 21:51:31

标签: c++ variables visual-studio-2015 member

我有一个类应该生成一个int矢量(在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成员函数中,我再次获得了read-acess-violation。

更新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: 我的一个更简单的错误已在评论中得到解决。问题很严重。谢谢大家。

1 个答案:

答案 0 :(得分:1)

由于以下原因,问题看起来是无效的指针:

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));

但仍需要迭代来填充数据。