【问题标题】:Insert and resize a vector of vector插入向量并调整其大小
【发布时间】:2012-07-16 05:53:01
【问题描述】:

如何调整包含整数值的向量的大小。

std::vector<std::vecotr<int>> MyVector;
int value = 10;

//need to insert values as 2 rows and 3 columns, like
//Myvector[0][0] = value;
//Myvector[0][1] = value;
//Myvector[0][2] = value;
//Myvector[1][0] = value;
//Myvector[1][1] = value;
//Myvector[1][2] = value;

// ......
//here i have to resize the vector size to 4 rows and 5 cols using resize() function.

MyVector.resize(.......); //Hoe is this possible.

第一个问题是,我必须将值插入为 2 行和 3 列。我怎样才能为此目的使用push_back 函数。之后需要调整到指定的大小。由于它是向量的向量,我对此感到担心。

【问题讨论】:

  • 在我的代码中,数组的大小是恒定的。所有的大小都是动态计算的,所以我更喜欢使用向量,而不是动态分配的数组,以避免内存泄漏。由于没有适当释放的动态分配会导致内存泄漏。

标签: c++ vector insert resize


【解决方案1】:

您可以将向量的向量视为一个矩阵,其中成员向量是“行”。

int main()
{
    std::vector<std::vector<int> > MyVector;
    //Create a row:
    std::vector<int> subVector;
    subVector.push_back(1);
    subVector.push_back(2);
    //put the row into the vector:
    MyVector.push_back(subVector);
    //create another row:
    subVector.clear();
    subVector.push_back(3);
    subVector.push_back(4);
    //put the second row into the vector
    MyVector.push_back(subVector);
    //access the first row and add an element to it:
    MyVector[0].push_back(6);
    //access the second row and add an element to it:
    MyVector[1].push_back(6);
}

【讨论】:

    【解决方案2】:

    您可以初始化向量以包含两个向量,每个向量代表一行。每个都可以初始化为包含 3 个元素,代表列:

    std::vector<std::vecotr<int>> MyVector(2, std::vector<int>(3));
    

    然后你可以通过推回新行来调整它的大小:

    // add a row
    MyVector.push_back(std::vector<int>(3));
    

    要添加列,可以 push_back 到每一行,最好使用辅助函数来实现

    void appendColumn(std::vector<int> v);
    

    我认为这一切都可以通过编写一个包装类来更好地管理,因此您可以轻松确保所有向量的维度都与 NxM 矩阵一致。

    【讨论】:

      【解决方案3】:

      您可以使 MyVector 成为您的 vectorvector 的包装类。您可以定义自己的调整大小操作。在这种情况下,我将其定义为在访问向量时延迟调整列的大小。

      struct MyVector {
        std::vector< std::vector<int> > vec_;
        size_t cols_;
        struct MySubVector {
          const MyVector &outer_;
          std::vector<int> &vec_;
          MySubVector (MyVector &outer, std::vector<int> &vec)
            : outer_(outer), vec_(vec) {}
          int & operator [] (int i) const {
            vec_.resize(outer_.cols_);
            return vec_[i];
          }
        };
        MySubVector operator [] (int i) {
          return MySubVector(*this, vec_[i]);
        }
        void resize (size_t rows, size_t cols) {
          vec_.resize(rows);
          cols_ = cols;
        }
      };
      

      如果您希望resize 在调整大小时为您设置一个特定值,那么您将必须迭代每一行并调用调整大小操作,并设置初始化程序。

      struct resize_cols {
        size_t cols;
        int val;
        resize_cols (size_t c, int v) : cols(c), val(v) {}
        void operator () (std::vector<int> &vec) const {
          vec.resize(cols, val);
        }
      };
      
      void resize (size_t rows, size_t cols, int v) {
        vec_.resize(rows);
        std::for_each(vec_.begin(), vec_.end(), resize_cols(cols, v));
      }
      

      【讨论】:

        【解决方案4】:

        在这种情况下,只需在外向量上使用resize 函数即可:

        MyVector.resize( 2, std::vector<int>( 3, value ) );
        

        更一般地说,如果您想在不更改现有值的情况下调整大小, 你必须循环。

        【讨论】:

          猜你喜欢
          • 2018-06-04
          • 1970-01-01
          • 1970-01-01
          • 2021-04-09
          • 1970-01-01
          • 2023-02-02
          • 1970-01-01
          • 1970-01-01
          • 2018-05-02
          相关资源
          最近更新 更多