插入并调整矢量矢量

时间:2012-07-16 05:53:01

标签: c++ vector insert resize

如何调整包含整数值的矢量矢量。

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函数。之后需要调整大小到指定的大小。由于它是矢量的矢量,我对此感到担忧。

4 个答案:

答案 0 :(得分:4)

您可以将矢量矢量视为矩阵,其中成员矢量是“行”。

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);
}

答案 1 :(得分: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矩阵一致。

答案 2 :(得分:0)

您可以在MyVector vector周围设置vector包装类。您可以定义自己的调整大小操作。在这种情况下,我将其定义为在访问向量时懒惰地调整列的大小。

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));
}

答案 3 :(得分:0)

在这种情况下,只需在外部矢量上使用resize函数:

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

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