std::erase()和std::erase_if()会导致vector重分配吗?二者效率孰优?
std::erase()/std::erase_if()的内存重分配与效率对比
1. std::erase()和std::erase_if()会触发vector内存重分配吗?
不会。vector的这两个移除操作仅会调整元素的存储位置——把需要保留的元素向前移动覆盖待移除元素的位置,然后更新容器的size()属性,但不会改变容器的capacity()(已分配的内存容量)。
内存重分配只会在容器需要扩容(比如push_back时空间不足)或者主动调用shrink_to_fit()(该操作不保证一定会触发,取决于实现)这类调整容量的操作时才会发生。你关于“移除元素不会申请额外内存,因此不会重分配”的推测完全正确。
2. erase-remove惯用法与std::erase_if()的效率对比
两者效率几乎无差异。从C++20开始,std::erase_if()本质就是erase-remove惯用法的标准化封装,底层逻辑完全一致:先通过类似std::remove_if()的方式将待保留元素移动到容器前端,再调用erase()删除末尾的无效元素区间。
在C20之前,开发者只能手动实现erase-remove惯用法;C20及之后,直接使用std::erase_if()代码更简洁、可读性更强,且效率和手动写法完全持平。
内容的提问来源于stack exchange,提问作者Alexander the Great
相关产品推荐
相关产品推荐

