首页 > 编程语言 >【c&c++】erase怎么用c语言,C++ erase()函数使用时的注意点

【c&c++】erase怎么用c语言,C++ erase()函数使用时的注意点

时间:2023-05-31 10:12:34浏览次数:53  
标签:end iterator 删除 元素 C++ erase c++ vec

遇见的场景

删除vector容器指定元素时;

erase()函数的用法

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素。

具体用法如下:

iterator erase(iterator _Where);

删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素;

iterator erase( iterator _First, iterator _Last);

删除从_First开始到_Last位置的元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置。

erase()函数的注意点

注意1:调用erase()函数之后,vector后面的元素会向前移位,形成新的容器。这样被删除的元素对应的迭代器,此时会变成一个野指针。

注意2:删除最后一个元素时,it指向vec.end(),然后会对vec.end()之上执行++操作,从而出现段错误(见上一篇博客)。所以需要加入if判断来避免。

即下述代码为错

for(auto it = vec.begin(); it != vec.end(); ++it){

if(*it == target)

vec.erase(it);//此时it变为野指针,而不是指向vec的下一个元素。

}

erase()正确使用方式

for(auto it = vec.begin(); it != vec.end(); ){

if(*it == target)

it = vec.erase(it);//此时it指向被删除元素的下一个位置。

else

it++;

}

或者

for(auto it = vec.begin(); it != vec.end(); ){

if(*it == target)

auto it2 = it;

vec.erase(it2);//此时it指向被删除元素的下一个位置。

else

it++;

}

【参考连接】

C/C++语言中erase()函数的用法

标签:end,iterator,删除,元素,C++,erase,c++,vec
From: https://www.cnblogs.com/opensmarty/p/17445261.html

相关文章

  • BDB c++例子,从源码编译到运行
    第一步先下载源码,解压后./dist/configure--enable-cxx编译,然后make,makeinstall--enable-cxxTobuildtheBerkeleyDBC++API,enter--enable-cxxasanargumenttoconfigure. 默认的安装路径是:/usr/local/BerkeleyDB.6.1/ 代码如下:#include<stdlib.h>#include<strin......
  • MongoDB C++ gridfs worked example
    使用libmongoc,参考:http://mongoc.org/libmongoc/current/mongoc_gridfs_t.html#include<mongoc.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>classMongoGridFS{public:MongoGridFS(constchar*db);~MongoGridFS();......
  • mongodb c++ driver安装踩坑记
     安装教程:https://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/(1)“initializer_list”filenotfoundhttp://stackoverflow.com/questions/19493671/initializer-list-no-such-file-or-directorySinceyouareusing GCC-4.8 andyourproblemisthatyoud......
  • 单链表(c++实现)
    template<typenameT>classListNode{public:explicitListNode(Tvalue_,ListNode*next_=nullptr):value(value_),next(next_){}TgetValue()const{returnvalue;}ListNode<T>*getNext()const{returnnext;};voidsetNext(ListNo......
  • 内存泄漏、缓存溢出?C和C++,哪个更懂得管理内存质量?
    一、c/c++程序内存区域划分c和c++的内存区域划分是十分相似的,因为c++是完全兼容c语言,是c语言的面向对象的升级版。接下来看如下图:程序的内存区域被划分成6个区域。内核空间、栈、内存映射段、堆、数据段、代码段。下面是对相关内存区域名词解释:栈又叫堆栈--非静态局部变量/函数参数......
  • 为什么 C++ 有指针了还要引用
    引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。别名,可不是真实的数据类型。因为,函数传递参数需要,数据复制,......
  • C++中模拟split
    #include<iostream>#include<sstream>usingnamespacestd;intmain(){ stringstr; getline(cin,str); istringstreamin(str); stringa; while(getline(in,a,'*')){ cout<<a<<''; } return0;}123*456*789123......
  • 蓝桥杯 基础练习 特殊回文数(C++)
    资源限制内存限制:512.0MBC/C++时间限制:1.0sJava时间限制:3.0sPython时间限制:5.0s问题描述123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n,编程求所有这样的五位和六位十进制数,满足各位数字之和等于n。输入格式输入一行,包含一个正整......
  • C++ 不想让转义字符发挥转义的功能
    今天写代码时,编译器有一个警告:我寻思着也没啥问题,于是就看了一下警告,然后回车,就成了这样,也就是说,字符串里面的转义字符不再时转义字符而是普通的字符了,输出看看是不是:果然是这样没错.......
  • 第十四届蓝桥杯大赛青少组全国总决赛初级组C++C++题解
    第十四届蓝桥杯大赛青少组全国总决赛初级组\(C++\)题解第一题给定一个十进制正整数\(N(1≤N≤10^9)\),请从小到大输出\(1\)~\(N\)之间(含\(1\)和\(N\))所有满足以下要求的数:这个数转换为八进制后是一个回文数;这个数是一个平方数。例如:\(N=20\),在\(1\)~\(20\)之间满足要求......