关于填充矢量的不同方式

kun*_*ami 5 c++ stdvector

我可以想到三种填充方式 std::vector

假设我们有

vector<int> v(100, 0);
Run Code Online (Sandbox Code Playgroud)

然后我想要它(1,1,1).我们可以做的:

v.clear();
v.resize(3, 1);
Run Code Online (Sandbox Code Playgroud)

要么

v = vector<int>(3, 1);
Run Code Online (Sandbox Code Playgroud)

我学到了另一种方法:

vector<int>(3, 1).swap(v); 
Run Code Online (Sandbox Code Playgroud)

第一个问题是:它们中的任何一种都是最好的方法吗?

第二个问题:假设v在主要功能之外被宣布.根据这个答案,存储器将被分配在数据段中.如果我使用第二种或第三种方法,是否会在堆栈上分配内存?

eta*_*ion 9

你怎么用这个任务的向量成员?

std::vector<int> v(100);
v.assign(3, 1); // this is what you should do.
Run Code Online (Sandbox Code Playgroud)


Edw*_*nge 3

因此,以下是差异,我将让您决定最适合您情况的方法。

v.clear();
v.resize(3, 1);
Run Code Online (Sandbox Code Playgroud)

在本例中,我们已将向量标记为已清除。它仍然保留为容纳 100 个元素而分配的任何内容(这可能超过 100 个元素所需的空间)。然后我们添加了 3 个值为 1 的项目。这只是增加了大小计数器并重置了 3 个值,底层内存仍然是相同的大小。

v = vector<int>(3, 1);
Run Code Online (Sandbox Code Playgroud)

这几乎做了同样的事情,除了创建了一个额外的临时向量,并且不是在间歇性的地方计数器为 0,然后是 3 的某些值,它简单地复制计数器大小,然后执行类似于 memcpy 的操作复制 3 个元素。为 v 分配的底层内存大小仍然足以容纳 100 个整数。

vector<int>(3, 1).swap(v); 
Run Code Online (Sandbox Code Playgroud)

这一个有很大不同。在本例中,我们创建一个临时向量,其中包含 3 个元素,这些元素全部初始化为 1。理论上,它仍然可以为 100 个元素保留足够的内存,但很可能它的内存要少得多。然后我们用我们自己的向量交换这个向量并让临时向量被销毁。这样做的额外好处是清除旧向量分配的任何不在临时内存中的额外内存。其工作方式是两个向量(我们的 v 和临时向量)不仅交换计数器和值,还交换缓冲区指针。

这是缩小向量的唯一方法。