关于清除std::vector
有很多问题和答案,我想知道为什么,在我读过的所有内容中,没有人只是说:
existingVector = std::vector<whatever>();
这不是清除矢量的简单方法吗?
答案 0 :(得分:5)
这确实很简单,但有一种更简单,更直接的方式:
existingVector.clear();
你也可以这样做:
existingVector.resize(0);
但我喜欢第一种方法,因为它完全按照它所说的做法。
同样,我更喜欢检查if(myVec.empty())
而不是if(myVec.size() == 0)
更新:如果您想要&#34; true reset&#34;,即您不仅希望尺寸变为0而且还要容量,那么您可以做一些事情
缩小以适应
vec.clear();
vec.shrink_to_fit();
正如注释正确指出的那样,shrink_to_fit也是一个非绑定请求,编译器可能会忽略它。
用新构造的向量交换
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
,并且由此可以不进行动态内存分配。但是,图书馆实施者有时可以通过优化进行创作。