Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新使用或清理多维向量_C++_Arrays - Fatal编程技术网

C++ 重新使用或清理多维向量

C++ 重新使用或清理多维向量,c++,arrays,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++) array2

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

#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;
注意:可以使向量超出范围,但理想情况下,我希望将向量作为类成员保留,并且仅在维度更改时调整大小并重新使用。这将是非常罕见的

std::vector<std::vector<int>> v(H, std::vector<int>(V));
...
v.clear();
通过使用C++11,可以很容易地用C++03编写普通循环

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


还请注意,如果要显式释放向量缓冲区,
clear
并不能单独做到这一点。在C++11中,有一个
shorn_to_fit
成员函数用于此函数,在C++03中,必须使用空向量进行交换。

调用外部向量上的clear将删除所有内部向量。如果你打算重用向量,这实际上是非常低效的。@erip:谢谢,我知道我可以让它超出范围,但这不是问题。如果你需要释放内存,你可以清除它。如果您只是想重用它,只需调整向量大小就更有效了。(重复设置大小步骤)@AlainD,因为清除外部向量会破坏所有内部向量,这意味着它们会将内存释放回堆。因此,如果你计划重用向量向量,你必须重新创建内部向量,这将导致更多的分配。至于效率——如果这是一个问题,将二维映射到单个一维数组/向量(并提供适当的访问器)可能是另一种选择……什么是“与空向量交换”平均值?@AlainD
swap
交换两个向量的内容。因此,如果使用
v.swap(e)
std::swap(v,e)
,其中
v
是向量,
e
是空向量(意思是
capacity()==0
,而不是
size()==0
),则清除向量容量。@AlainD此类交换通常使用临时空向量完成。例如,请参阅此答案了解更多详细信息:C++11不是一种“方言”。@ChristianHackl感谢您的澄清。我不是一个母语为英语的人,所以这些微妙之处对我来说有点让人困惑,因为我已经尝试过多次了(例如,谷歌找到了1000多个“C++11方言”匹配项)。
std::vector<std::vector<int>> v(H, std::vector<int>(V));
...
v.clear();
v.resize(NEW_H);
for (auto & inner_v : v)
  inner_v.resize(NEW_V);