假设有这样一个题目,将某个容器中所有满足条件N == X的元素删除,按照常规的思路应该有类似这样的代码: OK,现在说说erase对他们的操作,链表容器以list为例,当执行container.erase(it)时,确实第一个满足条件的元素删除了,但这时it指针已经被删除了,它也不指向任何元素了,所以也只能到此为止了,也就是说上面的代码对于链表容器来说只能正确删除第一个满足条件的元素,针对这个问题我们首先想到的就是在删除指针之前,给其做个备份,很好,不错的主意,我们一般采用的方法是建立个临时变量,这个临时变量可以在程序循环中适当的位置使用,看下列代码实现,是将这个临时变量直接建立在erase实现里,这样做更简洁,也显得专业些 链表容器使用erase删除节点还有一个特点,就是会将下一个元素的地址返回,所以也可以这样实现: 也可以使用reverse_iterator迭代器,并且在某些删除操作中会有更好的效率(因为它会使上面提到的“大动作”变小一些):
函数原型:
iterator erase(iterator where);
iterator erase(iterator first,iterator last);
basic_string& erase(size_type p0=0,size_type n=np);
删除某个容器里的某个元素:c.erase(T);
看似一个简单的动作,然而对不同类型的容器,内部却做了截然不同的事情,后面介绍。
Container<T>::iterator it;
for (it = container.begin(); it != container.end(); ++it) {
if (N == X)
container.erase(it);
}
然而这样的代码对于任一种容器都是错误的
容器按内存分配方式可以分为链表容器和数组容器。
所谓的链表容器指的是一种表现方式,包括list、slist等这样基于节点的容器(动态分配内存块)和set、map、multiset、multimap等关联容器(平衡树实现),而数组容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector、deque、string等。
(以删除int型链表中所有偶数为例,也是大家都喜欢的一个例子):
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
lt.erase(it++);
else
++it;
}
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
it = lt.erase(it);
else
++it;
}
当然用list容器本身提供的算法也是个不错的主意(挂回调):
{
return (n % 2 == 0);
}


lt.remove_if(evenNumber);
数组容器以vector为例,当执行container.erase(it)时,和上面提到的一样,第一个满足条件的元素删除了,但这时数组容器不允许中间有“空隙”,所以会做个大动作,就是将被删元素后面所有的元素前移(参考STL源码),而数组容器记录的是下标,所以删除元素后,当前下标定位的元素也就顺理成章的变成了原有队列中的下一个元素,同样以删除偶数为例,代码如下:
for (it = v.begin(); it != v.end(); ) {
if (*it % 2 == 0)
v.erase(it);
else
++it;
}
for ( ; ri != v.rend(); ) {
if (*ri % 2 == 0)
v.erase((++ri).base());
else
++ri;
}
相关推荐
Python自动化神器:OP插件64位版从安装到实战(附雷电模拟器截图技巧)
本文详细介绍了Python自动化神器OP插件64位版的安装与实战应用,包括环境搭建、窗口控制、鼠标键盘模拟等核心功能。特别针对雷电模拟器提供了最小化截图技术和OCR识别优化方案,帮助开发者高效实现Windows自动化任务。
stl容器之erase用法
本人最近工作中用到std::list,在删除元素时用到以下 for( iterator= List.begin(); iterator!= List.end(); iterator++) { if( iterator->nIndex == nIndex) { List.erase( it
【PVCodeNet】《Palm Vein Recognition Network Combining Transformer and CNN》
1]吴凯,沈文忠,贾丁丁,等.融合Transformer和CNN的手掌静脉识别网络[J].计算机工程与应用,2023,59(24):98-109.
C语言完成STL中的erase函数,STL中erase()的用法
erase()是STL提供的容器中比较常用的方法之一,它的功能是删除容器中的某些元素,其中它的函数原型如下:1.有两个参数,且参数类型都是size_t型:string& erase ( size_t pos = 0, size_t n = npos );功能是:删除容器中从pos位置开始的n个元素。返回值是经过删除操作后的容器。示例:#includeusing namespace std;...
手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手
通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。
黑马程序员Pink的javaScript课程APIday4
本文摘要:介绍了JavaScript中日期对象的实例化方法(有参/无参)及三种获取时间戳的方式。讲解了DOM节点操作,包括节点查找(父、子、兄弟节点)、增加/克隆/删除节点的方法。详细说明了移动端touch事件和Swiper插件的使用,包括自动播放和小圆点配置。最后提及学成在线案例中表单验证和取消默认跳转的实现。
c++之STL容器的erase()函数
一、关联容器 对于关联容器(如map, set, multimap, multiset), 删除当前的iterator, 仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。 #include<iostream> #include<set> using...
基于FPGA的图像预处理系统(图)
北京机械工业学院 韩娟娟 邓文怡 娄小平 由于获取图像的工具或手段的影响,使获取图像无法完全体现原始图像的全部信息。因此,对图像进行预处理就显得非常重要。预处理的目的是改善图像数据,抑制不需要的变形或者增强某些对于后续处理来说比较重要的图像特征。通常根据预处理目的的不同,把预处理技术归为图像增强技术和图像分割技术两类。图像对比度处理是空间域图像增强的一种方法。由于图像灰度范围狭窄会使
STL-erase与remove讲解
erase: 从指定容器删除指定的元素 两个重载: iterator erase (iterator position); 删除指定位置position的元素,并返回删除元素的下一个元素的迭代器 iterator erase (iterator first, iterator last); 删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器 错误用法1 #include<vector> #include<iostre.
从加权最小二乘(WLS)到IAA:手把手推导DOA估计中的迭代自适应核心公式
本文深入解析了从加权最小二乘(WLS)到迭代自适应算法(IAA)在DOA估计中的数学推导与应用。通过动态调整加权矩阵,IAA在低快拍数、相干源等复杂场景中展现出卓越性能,显著提升角度分辨率和检测概率。文章详细介绍了算法核心步骤、工程优化策略及前沿发展,为雷达探测和无线通信领域提供重要参考。
微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)
本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。
STL中用erase()方法遍历删除元素
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。 在使用 list、set 或 map遍历删除某些元素时可以这样使用: 正确使用方法1 std::list List; std::lis
YOLOv8与Swin Transformer的完美结合:如何提升目标检测的精度与速度
Swin Transformer(Shifted Window Transformer)是一种新型的视觉Transformer架构,采用了局部窗口(Window)和局部窗口偏移(Shifted Window)的策略,极大减少了计算复杂度,同时保持了全局感知能力。局部窗口注意力:每个窗口内的元素进行自注意力计算,减少计算量。窗口偏移:通过在不同层次引入窗口偏移,增强了全局信息的交互。层级设计:通过堆叠多个层次的模块,逐渐捕捉不同尺度的特征。
C++ STL map容器erase操作避坑
【代码】C++ STL map容器erase操作避坑。
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
STL中erase方法对链表类容器的影响
STL中提供erase算法用于删除通用容器内中某一个或是某一区间内的数据.而且通用于vector, list包括一般的数组都可以使用.但对于一般性不支持随机访问的容器,比如list容器是用链表指针进行连接的类,在使用earse算法的时候要格外注意.比如在C++ Primer中提供的一道练习,请写一个程序使它接受下列定义int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
容器list使用之erase
今天无论如何要写点东西,算是搞清楚了一点东西吧。有点小小的成就感。 之前在程序里面使用了list容器,其中用到了erase()函数,之前一直没出现问题,这两天突然莫名奇妙。花了点时间,搞清楚了erase()函数的机理。 常用的删除容器中元素的方法是如下(方法1): list< int> List; list< int>::it
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
STL中erase()用法陷阱
erase()函数的功能是用来删除容器中的元素 删除某个容器里的某个元素:c.erase(T); 看似一个简单的动作,然而对不同类型的容器,内部却做了截然不同的事情,后面介绍。 假设有这样一个题目,将某个容器中所有满足条件N == X的元素删除,按照常规的思路应该有类似这样
vector中erase()方法详解
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase( iterator _Where); 1.iterator erase( iterator _First, iterator _Last); 如果是删除指定位置的元素时: 返回值是一个迭代
vector的erase()
erase的函数原型有两种形式: iterator erase(iterator position);//删除单个位置 iterator erase(iterator first, iterator last);//删除一段 在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素...
C++ STL常用容器删除操作注意事項
C/C++程序员对STL 容器肯定不会陌生, 以下是对常用容器进行 erase 操作注意事项的总结:vectorvector 容器是用数组实现的, 它在内存是连续分布的.对它进行 insert 或 erase 操作涉及到对插入点或删除点后的元素进行移位, 所以插入点或删除点后的iterator 会失效. iterator erase( iterator pos ); iterator erase(
c++ STL_2 容器迭代器失效?
remove和erase函数 In total: remove函数在删除元素的时候,需要小心使用。 Description of algorithm : 是查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素。而最后返回的是指向的最后一个有效的元素的迭代器。 Look out!: 在remove算法过程中,并不会修改原容器的size(),以及en...
list、vector、map容器erase的区别
一句话总结:list、vector返回的迭代器,map返回空(C++98标准);注意迭代器不要越界。 map是从模板类继承来的,不同的C++版本标准其erase函数也不同: C++98 C++11 void erase (iterator position); iterator erase (const_iterator positio
30-seconds-of-cpp项目解析:C++ STL中map容器的erase操作详解
在C++标准模板库(STL)中,`map`是一种非常重要的关联容器,它以键值对(key-value)的形式存储数据。`erase()`作为`map`容器的一个核心成员函数,用于从容器中删除元素。本文将深入探讨`map::erase()`函数的各种用法和注意事项。 ## erase函数的基本用法 `map::erase()`函数有三种主要形式: 1. **通过键值删除元素**:`size_ty...
跟我学C++中级篇——STL中的删除
在STL中一般删除的方式有两类,一种是使用全局的std::remove(remove_if类似),一种是使用容器自带的erase,前者其实并没有真正的删除数据,而后者则是在移动时,会有一些细节的处理,否则要么程序崩溃,要么达不到删除的目的。下面就这两个函数进行一下分析说明。在一些容器中也提供了remove(如std::list)方法,它和全局的std::remove还是用法区别不小的,这个大家需要自己看一下。注:C++20提供了std::erase这种更方便的用法。
C++之erase、remove 、remove_if的区别
文章目录eraseearse所存在的坑:remove对vector来说对于list来说remove_if对于vector而言对于list而言 erase 作用:删除内存擦除 简单的说,就是能够从内存中擦除掉你想删除的元素 函数原型: (1)string&amp; erase ( size_t pos = 0, size_t n = npos ); (2)iterator erase ( itera...
vector中erase用法注意事项
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase( iterator _Where); iterator erase( iterator _First, iterator _Last); 如果是删除指定位置的元素时: 返回值是一个迭代器,指向删除
333



被折叠的 条评论
为什么被折叠?



