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());     // 按迭代器删
相关推荐
mlidongfeng1 小时前
【学习】 NVIDIA CFT(Compute Fabric Transport)特性分析
人工智能·学习·fabric
lee_tianbai1 小时前
Java SSM 电影票预定系统|完整前后端项目,开箱即用(源码分享)
java·开发语言·数据库
小李不想当小白1 小时前
USART串口协议(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
All for pursuit.2 小时前
【并查集-2】399.除法求值
数据结构·c++·算法·leetcode
迪丽热爱2 小时前
一、C语言概述与程序结构
c语言·开发语言·算法
HUIBUR科技2 小时前
AI中枢:打破数据孤岛与流程孤岛双重困境
开发语言·ai
鱼宵2 小时前
LangChain4j 结构化输出:让模型吐出 Java 对象,JSON 不再手写解析
java·开发语言·json·langchain4j
w2sfot2 小时前
【JS加密在线】jsjiami.online(让JavaScript 更安全!)
开发语言·javascript·安全