在多维向量中插入元素

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

}

向多维 vector 插入元素,使其为一个 4x4 的数组。当前输出的 sort_a 向量是 31x1,其中有很多空元素。

2个回答

9

不要把它看作是一个多维向量,而应该把它看作是一组向量的集合。

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的调用会导致代码变慢,因为你不仅需要一直重新分配向量,而且还必须创建一个临时对象并将其复制。

1
这将尝试在向量末尾之外进行写入。 - interjay
通过保留元素,我可以使用[][]方法传递值,但由于存在大量不必要的分配,我想在需要时仅使用pushback和插入值,我该怎么做? - Gambit King
@interjay:抱歉,由于某种原因,我认为向量已经被正确地调整大小了。 - prazuber
你不必在循环内调整大小。你可以在初始化时完成所有操作。只需创建一个大小为4的向量,其中包含大小为4的向量即可。 - juanchopanza

4

vector<vector<int>>并不是一个最好的多维存储实现方式。以下实现方式对我来说效果更好。

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;

这个解决方案与这里描述的解决方案相似。


你可以在构造函数初始化列表中初始化向量a,从而避免调用resize。这可以避免一次重新分配。 - juanchopanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接