如何用默认值填充 `std::vector<std::vector<T> >`?

5

那我尝试这样做:

std::vector< std::vector<int> > matrix(4);

matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[0][3] = 1;

matrix[1][0] = 1;
matrix[1][1] = 2;
matrix[1][2] = 3;
matrix[1][3] = 1;

matrix[2][0] = 1;
matrix[2][1] = 2;
matrix[2][2] = 3;
matrix[2][3] = 1;

matrix[3][0] = 1;
matrix[3][1] = 2;
matrix[3][2] = 3;
matrix[3][3] = 1;

但是出现了问题,我的应用程序在运行时崩溃=( 怎么办?如何正确嵌入值到向量的向量中?


除此之外,你是否可以使用C++11呢?另外,你没有调整向量的大小吗? - PlasmaHH
很遗憾,我不能使用C++11 =( - Rella
但是我确实想知道在C++11中如何以不同的方式完成这个任务? - Rella
1
你可能想提供一个类来模拟矩阵,使用单个4x4元素的分配和operator()(int,int)来访问每个元素。这是提供N维数组的常见模式(单个分配器,接受N个索引并在内部执行算术运算的访问器)。 - David Rodríguez - dribeas
@DavidRodríguez-dribeas:如果你真的想要[x][y]语法,你可以让该类的operator[]返回一个代理类MatrixRow或其他类。 - Björn Pollex
1
@c++11可以使用类似于{{1,2,3,4},{5,6,7,8}}的统一初始化语法...在c++03中,您可能还可以使用boost assign。 - PlasmaHH
2个回答

11

使用这个:

std::vector< std::vector<int> > matrix(4, std::vector<int>(4));

这将使用4个std::vector<int>(4)的副本来初始化你的外部向量。


2
在这种情况下,您可以采用Björn的方法并将2D向量完全初始化为您提供的值:
std::vector<int> tmp(4,0); 
tmp[0] = 1;
tmp[1] = 2;
tmp[2] = 3;
tmp[3] = 1;

std::vector< std::vector<int> > matrix(4, tmp);

可以简单地写成:

std::vector<int> tmp(4,1); 
tmp[1] = 2;
tmp[2] = 3;

std::vector< std::vector<int> > matrix(4, tmp);

但是为了清晰明了起见,我经常偏向于第一个选项。


2
你可以使用Boost.Assign使其更好。 - Björn Pollex
@Björn ...或者你可以参考我的例子,就像我参考了你的一样 ;) - justin

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