如何在C++中声明和初始化一个二维int向量?

5
我正在尝试做类似于以下的事情:
#include <iostream>
#include <vector>
#include <ctime>

class Clickomania
{
    public:
        Clickomania();
        std::vector<std::vector<int> > board;
};

Clickomania::Clickomania()
    : board(12, std::vector<int>(8,0))             <<<<<<<
{

    srand((unsigned)time(0));

    for(int i = 0; i < 12; i++)
    {
        for(int j = 0; j < 8; j++)
        {
            int color = (rand() % 6) + 1;
            board[i][j] = color;
        }
    }
}

然而,显然我不能以这种方式初始化“board”向量的向量。

我该如何创建一个2D向量类型的公共成员并正确地进行初始化?


3
为什么你不能这样初始化呢?(除了你应该在其他地方调用srand而不是每次创建板子时都调用它的事实之外)。 - James McNellis
1
它在Visual Studio 2005中编译得很好。确切的编译器错误是什么? - In silico
编译并且看起来没问题。但是,你应该在其他地方调用srand函数,并提供参数而不是使用“魔法数字”12、8、0、6等等。 - M. Williams
你能详细说明一下你遇到的任何错误吗?上面看起来很好。从风格上讲,我更喜欢你使用前增量 ij 而不是后增量,但这不会影响结果。 - Nathan Ernst
1
我正在使用VS2010,并尝试使用上述代码创建2D向量。在“board[i][j] = color;”中的“[j]”下面,我收到编译器错误 - “表达式必须具有指向对象类型”。如果这个问题不是如此密切相关,我几乎会自己提出一个问题。 - T. Webster
1
@Inquisitor,你把“board”定义为什么了吗? - Jonathan Mee
3个回答

12

你应该使用允许你指定两个向量的大小和初始值的构造函数,这可能会让整个过程更加容易。

就像这样:

vector<vector<int>> v2DVector(3, vector<int>(2,0));

应该可以正常工作。


5
这正是原帖作者所做的。 - James McNellis
是的,我刚注意到了。不知道我怎么错过了它。 - sanimalp

5
请使用矩阵代替:
(来自boost文档的基本示例)
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main () {
    using namespace boost::numeric::ublas;
    matrix<double> m (3, 3);
    for (unsigned i = 0; i < m.size1 (); ++ i)
        for (unsigned j = 0; j < m.size2 (); ++ j)
            m (i, j) = 3 * i + j;
    std::cout << m << std::endl;
}

3
也许是因为它与上面问题中要求的使向量工作无关。我不知道。我认为对其进行负评有点严厉——毕竟,这个答案 可能 会有帮助——但从技术上讲,它并没有回答问题。 - Jonathan M Davis
3
即使回答并没有确切回应提问者的问题,我认为没有必要对一份有帮助的回答点踩。+1 - AndersK

3
使用g++编译代码时,我遇到了错误,提示没有声明srand()rand()。我不得不添加#include <cstdlib>才能编译代码。但一旦我这样做了,它就可以正常工作了。所以,除了添加这个包含语句之外,你的代码是正确的。你已经正确地初始化了向量。
也许你的代码与你发布的内容不完全匹配?我会认为,如果你的实际代码没有包含,那么你很快就会明白这是问题所在,而不是向量的问题。所以,如果不是这个原因,那么你使用的编译器是什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接