【问题标题】:How to resize dynamically a two dimentional vector?如何动态调整二维向量的大小?
【发布时间】:2011-04-27 16:34:48
【问题描述】:

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

//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 时报告错误。我认为我在调整矢量大小时遇到​​问题。

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

提前感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

    我想你想要:

     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] 等方面不一致,那么您最终会得到一个“锯齿状”数组。您可能希望将整个事情封装在一个类中以强制实现这种一致性。

    【讨论】:

    • “您可能希望将整个事情包装在一个类中以强制保持一致性。”请不要自己动手;使用boost::multi_array
    • 非常感谢!我认为您的解决方案对我来说是最准确的解决方案。
    【解决方案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&lt;=i&lt;100&lt;=j&lt; 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!
    

    您收到错误是因为您在第二次调用 push_back 时没有确保 0&lt;=i&lt;10&lt;=j&lt;1 约束。

    【讨论】:

      【解决方案3】:
      // 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);
      

      这是一种可能且正确的方法。

      【讨论】:

        【解决方案4】:

        您的假设是正确的,嵌套容器的替代方案是 Boost multi_array,但它的通用性较低。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-22
          • 2016-04-24
          • 2020-04-10
          • 2011-05-30
          • 2011-02-08
          相关资源
          最近更新 更多