ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C++容器中元素删除的方法技巧分享

2026/10/8 1:11:42 拓冰建站 浏览量
C++容器中元素删除的方法技巧分享 删除特定值的所有对象1. 连续内存容器vector, string, deque对于连续内存容器推荐使用erase-remove习惯用法【1†source】【5†source】1c.erase(remove(c.begin(), c.end(), 1963), c.end());这里remove操作并不会真正移除元素而是将后面的元素覆盖要删除的元素并返回新区间的逻辑终点。随后erase负责删除两个迭代器之间的元素。2. 链表容器list对于list容器直接使用成员函数remove更为高效【1†source】1c.remove(1963);3. 标准关联容器set, multiset, map, multimap关联容器应使用其erase成员函数【5†source】1c.erase(1963);// 对数时间复杂度比序列容器更高效删除满足特定条件的对象1. 序列容器vector, string, deque, list使用erase-remove_if习惯用法【1†source】1c.erase(remove_if(c.begin(), c.end(), badValue), c.end());对于list直接使用成员函数1c.remove_if(badValue);2. 标准关联容器有两种解决方案【5†source】方案一使用remove_copy_if和swap12345AssocContainerint goodValues;remove_copy_if(c.begin(), c.end(),inserter(goodValues, goodValues.end()),badValue);c.swap(goodValues);方案二使用迭代器循环删除12345for(auto i c.begin(); i ! c.end();/* 无操作 */)if(badValue(*i))c.erase(i);// 后缀递增确保安全elsei;循环内执行额外操作时的删除1. 序列容器利用erase的返回值更新迭代器【1†source】1234567for(auto i c.begin(); i ! c.end(); )if(badValue(*i)) {logFile Erasing *i \n;i c.erase(i);// erase返回下一个有效迭代器}else{i;}2. 关联容器使用后缀递增确保迭代器有效性【5†source】1234567for(auto i c.begin(); i ! c.end();/* 无操作 */)if(badValue(*i)) {logFile Erasing *i \n;c.erase(i);// 先递增再删除}else{i;}总结选择正确的删除方法需要考虑容器类型和删除条件【1†source】【5†source】特定值删除序列容器erase-removelistremove关联容器erase条件删除序列容器erase-remove_iflistremove_if关联容器循环删除或remove_copy_ifswap循环内额外操作序列容器利用erase返回值关联容器后缀递增迭代器掌握这些技巧可以显著提高C程序的效率和安全性是每个C开发者必备的技能。