C++ vector :: clear

lad*_*afa 23 c++ vector

vector <weight> decoy;

void clear_decoy() {  

    decoy.clear();   

    vector<weight> (decoy).swap(decoy);  
}
Run Code Online (Sandbox Code Playgroud)

在上面的方法中clear_decoy(),请问vector<weight> (decoy).swap(decoy); 是什么意思?

该方法是否清楚decoy?谢谢!

Jam*_*ran 22

我以前从未见过那种形式.

我看到它写成:

vector<weight>().swap(decoy);
Run Code Online (Sandbox Code Playgroud)

这意味着"创建一个新的空向量,并将其与现有的向量交换.

vector<weight> (decoy).swap(decoy);

要理解这一点,请打入零件.

vector<weight>(decoy) 创建一个新的向量(从现在空的诱饵中复制它的内容).新的向量是一个自治的临时性,所以让我们说它的名字是newvector.

newVector.swap(decoy); 用decopy交换新的向量.

(根据评论更新以修复错误)

  • +1表示同一事物的更好(和更多)共同构造. (3认同)
  • 那必须是`vector <weight>().swap(decoy)`.您可以在临时对象上调用成员函数,但不能将它们作为非const引用参数传递. (2认同)

Bil*_*eal 20

它创建了一个新的Weight对象向量(它将为空)并与之交换decoy.

这样做的原因是,默认情况下,std::vector<t>::clear通常不会实际减少向量使用的存储空间,它只会破坏其中包含的所有对象.这样,向量有空间存储更多对象,而无需将来重新分配.

但是,有时您需要修剪向量中的容量.使用新创建的向量进行交换(直到它的行结束,因此在那里被销毁)释放向量分配的所有内存.


Mik*_*our 10

该代码尝试使用通用技巧来确保释放向量分配的内存失败.实际上可能会或可能不会这样做,具体取决于向量的复制构造函数是否分配内存以匹配其他向量的大小或其容量.

要可靠地释放内存,请使用以下命令:

void clear_decoy() {  
    vector<weight>().swap(decoy);  
}
Run Code Online (Sandbox Code Playgroud)

这会创建一个临时的空向量(分配很少或没有内存),交换它decoy以便内存现在由临时所有,然后销毁临时,释放内存.


Fre*_*son 6

clear从向量中删除所有条目,但可能不一定取消分配空间.此交换习惯用法将向量恢复为不分配空间.

  • 实际上`clear`*可以*释放向量占用的空间.但它没有*.但它通常不适用于大多数STL实现. (3认同)