【问题标题】:Inserting elements in multidimensional Vector在多维向量中插入元素
【发布时间】:2012-12-05 21:09:06
【问题描述】:
vector<vector<int>> sort_a;
vector<int> v2;
vector<int> v3;

for (int i=0; i<4; ++i) {
v2.push_back(i);

  for (int j=0; j<4; ++j) {
  v3.push_back(j);
  sort_a.push_back(v2);
  sort_a.push_back(v3);
  }

}

向量 sort_a 应该是一个 4x4 数组,而不是输出是 31x1 有很多空元素,我如何在多维向量中插入元素?

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    不要将其视为多维向量,将其视为向量的向量。

    int n = 4;
    std::vector<std::vector<int>> vec(n, std::vector<int>(n));
    
    // looping through outer vector vec
    for (int i = 0; i < n; i++) {
      // looping through inner vector vec[i]
      for (int j = 0; j < n; j++) {
        (vec[i])[j] = i*n + j;
      }
    }
    

    为了便于理解,我在(vec[i])[j] 中加入了括号。

    编辑:

    如果你想通过push_back填充你的向量,你可以在内循环中创建一个临时向量,填充它,然后将它push_back到你的向量:

    for (int i = 0; i < n; i++) {
      std::vector<int> temp_vec;
    
      for (int j = 0; j < n; j++) {
        temp_vec.push_back(j);
      }
    
      vec.push_back(temp_vec);
    }
    

    但是,push_back 调用会导致代码变慢,因为您不仅需要一直重新分配向量,而且还必须创建一个临时的并复制它。

    【讨论】:

    • 这将尝试超出向量的结尾。
    • 通过保留元素,我可以使用 [][] 方法来传递值,但是由于有很多不需要的分配,我想只在需要时使用推回和插入值,我该怎么做?
    • @interjay:抱歉,出于某种原因,我认为向量已经正确调整大小。
    • 您不必在循环内调整大小。您可以在初始化中完成所有操作。只需制作一个大小为 4 的向量,其中包含大小为 4 的向量。
    • @juanchopanza:谢谢,已修复。
    【解决方案2】:

    vector&lt;vector&lt;int&gt;&gt; 不是多维存储的最佳实现。以下植入对我有用。

    template<typename T>
    class array_2d {
        std::size_t data;
        std::size_t col_max;
        std::size_t row_max;
        std::vector<T> a;
    public:
        array_2d(std::size_t col, std::size_t row) 
             : data(col*row), col_max(col), row_max(row), a(data)
        {}
    
        T& operator()(std::size_t col, std::size_t row) {
            assert(col_max > col && row_max > row)
            return a[col_max*col + row];
        }
    };
    

    用例:

    array_2d<int> a(2,2);
    a(0,0) = 1;
    cout << a(0,0) << endl;
    

    此解决方案类似于here 描述的解决方案。

    【讨论】:

    • 您可以在构造函数初始化列表中初始化向量a,从而避免调用rezize。这样可以避免一次重新分配。
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多