将std向量重新分配给默认构造函数向量是一种擦除的好方法吗?

时间:2016-12-22 11:55:31

标签: c++ vector

关于清除std::vector有很多问题和答案,我想知道为什么,在我读过的所有内容中,没有人只是说:

existingVector = std::vector<whatever>();

这不是清除矢量的简单方法吗?

2 个答案:

答案 0 :(得分:5)

这确实很简单,但有一种更简单,更直接的方式:

existingVector.clear();

你也可以这样做:

existingVector.resize(0);

但我喜欢第一种方法,因为它完全按照它所说的做法。

同样,我更喜欢检查if(myVec.empty())而不是if(myVec.size() == 0)

更新:如果您想要&#34; true reset&#34;,即您不仅希望尺寸变为0而且还要容量,那么您可以做一些事情

  1. 缩小以适应

    vec.clear();
    vec.shrink_to_fit();
    
  2. 正如注释正确指出的那样,shrink_to_fit也是一个非绑定请求,编译器可能会忽略它。

    1. 用新构造的向量交换

      vector<whatever>().swap(vec);
      

答案 1 :(得分:5)

分配是可以的,但可以允许优化实现保留原始内存缓冲区,以避免重新分配。

强行释放矢量的传统智慧是“与临时交换”:

#include <vector>
#include <iostream>


int main() {

    std::vector<int> a(256);

    std::vector<int>().swap(a);

    std::cout << a.size() << " / " << a.capacity();

    return 0;
}

以上总是打印0 / <minimum_capacity_for_vec_impl>因为矢量必须交换其内部缓冲区。然后立即销毁临时表,释放内存。

<minimum_capacity_for_vec_impl> 通常为0,因为默认构造函数是noexcept,并且由此可以不进行动态内存分配。但是,图书馆实施者有时可以通过优化进行创作。