重复使用或清理多维向量

时间:2018-01-16 10:52:28

标签: c++ arrays

一个基本问题。假设我已经定义了一个多维数组,如下所示:

#include <vector>
using std::vector;

#define HEIGHT 5
#define WIDTH  3

// Define vector
vector<vector<int> > array2D;

// Set up size
array2D.resize(HEIGHT);
for (int i = 0; i < HEIGHT; i++)
  array2D[i].resize(WIDTH);

// Put some values in
array2D[1][2] = 6;
array2D[4][1] = 5;

现在我想重新使用数组或显式清理内存。我只是打电话给array2D.clear();(希望能自动清理行)或者我必须先明确清除每一行吗?

// Option 1: Is this sufficient?
array2D.clear();

// Option 2: Or do I need to explicitly clear each row:
for (int i = 0; i < HEIGHT; i++)
  array2D[i].clear();

array2D.clear();

注意:矢量可能超出范围,但理想情况下我希望将矢量作为类成员保存,并且仅在尺寸更改时调整大小并重新使用。这将是非常罕见的。

1 个答案:

答案 0 :(得分:1)

std::vector<std::vector<int>> v(H, std::vector<int>(V));
...
v.clear();

这将破坏所有内部向量,从而释放它们的缓冲区。如果您想重复使用不同大小的v,最好写一下:

v.resize(NEW_H);
for (auto & inner_v : v)
  inner_v.resize(NEW_V);

使用C ++ 11,可以使用普通循环在C ++ 03中轻松编写。

为了真正有效地调整大小,您可能还需要提前设置外部矢量和所有内部矢量的容量。

另请注意,如果要显式释放矢量缓冲区,clear不会单独执行此操作。在C ++ 11中,有shrink_to_fit成员函数,在C ++ 03中你必须用空向量交换。