c++中如何清空vector容器_c++ vector清空元素

clear()最常用且安全,销毁元素并置size为0但不释放内存;需彻底释放时应组合shrink_to_fit()或用swap技巧;切勿用erase替代,清空后须用empty()判空再访问。

直接调用 clear() 是最常用且安全的方式

它会销毁所有元素并把 size() 设为 0,但不释放底层内存(capacity() 不变)。适合后续还会往里 push 大量新元素的场景,避免反复分配内存。

示例:

std::vector v = {1, 2, 3, 4, 5};
v.clear(); // size == 0, capacity 通常仍为 5 或更大

注意:clear() 对含资源的对象(如 std::vector<:string>)会正确调用每个元素的析构函数,不会泄漏。

想彻底释放内存?得手动触发重分配

clear() 不动 capacity(),如果之后长期不用或容器很大,可能浪费内存。此时需配合 shrink_to_fit()(C++11 起):

  • v.clear(); v.shrink_to_fit(); —— 推荐组合,语义清晰
  • 老标准(C++98/03)可用 std::vector().swap(v);,靠临时对象析构强制归零容量

shrink_to_fit() 是非强制请求,实现可忽略;而 swap 方式 100% 有效,但可读性稍差。

别用 erase(begin(), end()) 替代 clear()

虽然效果一样,但没必要:

  • 多打字,语义不如 clear() 直观
  • 某些编译器优化后等价,但无优势;未优化时还多一次迭代器计算
  • 容易写错范围,比如漏掉 end() 导致未定义行为

错误示范:

v.erase(v.begin()); // 只删第一个,不是清空

清空后访问元素会崩溃,务必检查 empty(

)

clear()v[0]v.at(0)、解引用 v.begin() 都是未定义行为。调试时可能 crash 或返回垃圾值。

安全做法:

  • v.empty() 判断是否为空,而非依赖 size() == 0(虽等价但更习惯)
  • 迭代前先判空:
    if (!v.empty()) { for (auto& x : v) { ... } }

尤其在函数传参或跨模块使用 vector 时,不能默认调用方已清空或未清空。