C++ erase() 函数用法

前言:对C++容器的操作(增删改查),我们需要掌握一些函数技巧,否则很容易使代码变得很冗长,效率低效。今天,我们来看看删除容器或字符串中的元素,如何使用erase()函数提高代码质量。

目录

一、字符串中的erase

二、vector中的erase

三、map中的erase


一、字符串中的erase

假如我们有这样一个字符串:

cpp 复制代码
string s = "hello world!";
  1. 如果你想删除world,如何操作?
cpp 复制代码
s.erase(5);          // 删除下标 5 直到到结尾 →  "hello"
  1. 下面这行是什么意思呢?
cpp 复制代码
s.erase(5, 6)
cpp 复制代码
//解释:从下标 5 开始删 6 个元素  →  "hello!"
  1. 删除某指定元素
cpp 复制代码
s.erase(s.begin()+4);              // 删除迭代器指向的字符
  1. 区间删除
cpp 复制代码
s.erase(s.begin(), s.begin()+5);   // 删除区间 [begin, begin+5)

特别需要注意的是 : s.erase(5) 只有一个参数时,是"删到结尾",不是"删 1 个"。

二、vector中的erase

假如我们有这样一个vector:

cpp 复制代码
vector<int> v = {1, 2, 3, 4, 5};
  1. 删除某一个元素
cpp 复制代码
v.erase(v.begin() + 2);              // 删除 3 → {1,2,4,5}
  1. 区间删除
cpp 复制代码
v.erase(v.begin(), v.begin() + 2);   // 删除前 2 个 → {3,4,5}
  1. 循环中删除某元素

需要特别注意迭代器失效的情况:

陷阱:

cpp 复制代码
//删除所有偶数
for (auto it = v.begin(); it != v.end(); ++it) {
    if (*it % 2 == 0) v.erase(it);   // it 已失效,++it 是未定义行为
}

正确做法:

cpp 复制代码
// 删除所有偶数
for (auto it = v.begin(); it != v.end(); ) {
    if (*it % 2 == 0) {
        it = v.erase(it);   // ✅ erase 返回下一个有效迭代器
    } else {
        ++it;
    }
}
  1. erase-remove组合

假如我们有这样一个vector:

cpp 复制代码
vector<int> v = {1, 2, 3, 4, 5, 6};

如果要删除所有偶数:

cpp 复制代码
// 删除所有偶数
v.erase(remove_if(v.begin(), v.end(),
                  [](int x){ return x % 2 == 0; }),
        v.end());

上述删除逻辑解析:

bash 复制代码
原数组:  1  2  3  4  5  6
remove_if 把奇数依次往前搬:
          1  3  5  4  5  6
          ↑     ↑  └─ 新逻辑末尾(返回值指向这里)
          └─────┘    保留区

erase(新末尾, end) 把尾巴砍掉 → {1, 3, 5}

三、map中的erase

假如我们有这样一个map数据:

cpp 复制代码
map<string,int> m = {{"a",1},{"b",3}};
  1. 按键删除
cpp 复制代码
m.erase("b");           // 按键删
  1. 按迭代器删除
cpp 复制代码
m.erase(m.begin());     // 按迭代器删
相关推荐
呆呆虫124 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
楚山之石4 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
心疼你的一切5 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Zwawa5 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Wang's Blog6 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
会编程的小孩6 小时前
C++ 定时器
c++
海海不掉头发6 小时前
CSDN博客_时序预测9模型复现对比
人工智能·学习·软件工程
中科三方6 小时前
IPv6检测常见问题:AAAA记录检测不通过是什么原因?
开发语言·php
沫璃染墨7 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
刚入门的大一新生7 小时前
Linux-线程互斥
java·开发语言