STL——vector.erase使用
简介
vector::erase 从指定容器删除指定的元素
两个重载:
iterator erase (iterator position);
删除指定位置position的元素,并返回删除元素的下一个元素的迭代器
iterator erase (iterator first, iterator last);
删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器
错误用法1
#include<vector> #include<iostream> #include<algorithm> using namespace std; void print(int n) { cout << n << " "; } int main(int argc, char** argv) { int arr[6] = { 1,2,3,3,4,3 }; vector<int> vc(arr, arr + 6); vector<int>::iterator iter; for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); iter++) { if (3 == *iter) { vc.erase(iter); } } for_each(vc.begin(), vc.end(), print); system("pause"); return 0; }
编译OK,运行报错。
vc.erase(iter)执行之后,iter就变成了野指针,对一个野指针进行iter++操作肯定会出错。
错误用法2
保存vc.erase(iter)返回值
#include<vector> #include<iostream> #include<algorithm> using namespace std; void print(int n) { cout << n << " "; } int main(int argc, char** argv) { int arr[6] = { 1,2,3,3,4,3 }; vector<int> vc(arr, arr + 6); vector<int>::iterator iter; for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); iter++) { if (3 == *iter) { iter = vc.erase(iter); } } for_each(vc.begin(), vc.end(), print); system("pause"); return 0; }
编译OK
运行报错。
①无法连续删除2个连续的3
②当3位于vector最后位置时,也会报错。错误原因,在vc.end()上执行++操作
正常情况下,vc.end()执行如下位置
正确做法
for语句里面删除元素时,返回值指向已删除元素的下一个位置,不是删除元素是直接进行++操作。
#include<vector> #include<iostream> #include<algorithm> using namespace std; void print(int n) { cout << n << " "; } int main(int argc, char** argv) { int arr[6] = { 1,2,3,3,4,3 }; vector<int> vc(arr, arr + 6); vector<int>::iterator iter; for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); ) { if (3 == *iter) { iter = vc.erase(iter); } else { ++iter; } } for_each(vc.begin(), vc.end(), print); system("pause"); return 0; }
分类:
C/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2017-03-04 直通线、交叉线、反转线怎么连接
2017-03-04 广播域和冲突域