如何动态调整二维向量的大小?

时间:2011-04-27 16:34:48

标签: c++ visual-c++ stl

我需要调整二维矢量(未知大小)的大小,如下所示:

//Creating the vector of vectors: 

vector< vector< long > > v;

//Resizing the vectors:

/*Needing help here: 

my current assumption is: 
v.resize(1);
v[0].resize(1);
*/

//Adding elements:

v[0][0].push_back(0); 
v[0][1].push_back(-1); 

编译器在应用push_back时报告错误。我想我在调整矢量大小时遇到​​了问题。

目标是创建一个二维向量,根据添加的值动态分配内存。

提前感谢您的帮助

4 个答案:

答案 0 :(得分:2)

你的假设是正确的。但是如果你想调整所有内部向量的大小,那就这样做:

vector< vector< long > > v;    
v.resize(10);
for(size_t i = 0 ; i < 10 ; i++ )
    v[i].resize(20);

请记住,当您使用v作为v[i][j]时,请确保0<=i<100<=j< 20


现在为什么你的错误与你正在做的一样?

v.resize(1);
v[0].resize(1); //that means, the constraint is : `0<=i<1` and `0<=j<1`

v[0][0].push_back(0); 
v[0][1].push_back(-1);  //problematic line!

您收到错误是因为第二次拨打0<=i<1时无法确定0<=j<1push_back限制。

答案 1 :(得分:2)

您关于调整两个维度大小的假设是正确的,但是您在push_back上收到错误,因为v[0][0]的类型是long &,而不是vector<long> &

我想你想要:

 v.resize(1);
 //Don't resize the second dimension because you want it to grow dynamically
 //v[0].resize(1);
 v[0].push_back(0);
 v[0].push_back(-1);

请记住,push_back仅调整特定行/列的大小。如果您对将v[0]v[1]等添加相同数量的元素不一致,那么您最终会得到一个“锯齿状”数组。您可能希望将整个事情包装在一个类中以强制执行该一致性。

答案 2 :(得分:1)

// your current assumption is: 
v.resize(1);
v[0].resize(1);
// modify the value
v[0][0] = new_value;

// resize again
v.resize(2);
for ( iterator iter = v.begin(); iter != v.end(); ++iter )
  iter->resize(2);

这是一种可行且正确的方式。

答案 3 :(得分:1)

您的假设是正确的,替代嵌套容器的是Boost multi_array,但它不太普遍。