如何在 C++ 中声明和初始化 2d int 向量?
Posted
技术标签:
【中文标题】如何在 C++ 中声明和初始化 2d int 向量?【英文标题】:How do I declare and initialize a 2d int vector in C++? 【发布时间】:2010-04-28 23:30:51 【问题描述】:我正在尝试做类似的事情:
#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;
但是,显然我不能以这种方式初始化向量的“板”向量。
如何创建 2d 矢量类型的公共成员并正确初始化它?
【问题讨论】:
为什么不能这样初始化呢? (除了您可能应该在其他地方调用srand
,而不是每次创建板时)。
它在 Visual Studio 2005 中编译得很好。究竟是什么编译器错误?
编译并且看起来不错。不过,您应该在其他地方调用srand
并提供参数而不是“幻数”`12、8、0、6 等...
我正在使用 VS2010 并尝试使用上面的代码创建一个二维向量。我在“board[i][j] = color;”中的“[j]”下得到一个编译器错误- “表达式必须具有指向对象的类型”。如果这个问题不是那么密切相关,我几乎会自己提出一个问题。
@Inquisitor 你把board
定义为什么?
【参考方案1】:
您应该使用允许您为两个向量指定大小和初始值的构造函数,这可能会使其更容易一些。
类似:
vector<vector<int>> v2DVector(3, vector<int>(2,0));
应该可以。
【讨论】:
这正是 OP 所做的。 是的,刚刚注意到..不知道我是怎么错过的。【参考方案2】:改用矩阵:
(来自 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;
【讨论】:
也许是因为它与让向量在上面的代码中像所问的问题一样工作无关。我不知道。我认为反对它有点苛刻 - 毕竟这个答案是可能有帮助的 - 但它在技术上并没有回答这个问题。 +1,我认为没有必要对有用的答案投反对票,即使它没有完全回答 OP 的问题。【参考方案3】:用 g++ 编译你的代码,我得到的错误是 srand()
和 rand()
都没有被声明。我必须添加#include <cstdlib>
才能编译代码。但是一旦我这样做了,它就工作得很好。所以,我想说除了添加包含语句之外,你的代码很好。您正在正确初始化向量。
也许您拥有的代码与您发布的代码不太匹配?我假设如果您的实际代码不包含 cstdlib,那么您很快就会明白这是问题所在,而不是向量的问题。因此,如果您的代码与您发布的内容不完全匹配,也许这就是问题所在。如果没有,您使用的是什么编译器?
【讨论】:
以上是关于如何在 C++ 中声明和初始化 2d int 向量?的主要内容,如果未能解决你的问题,请参考以下文章