- 浏览: 61466 次
- 性别:
- 来自: 武汉
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}
或
正确使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase( itList++);
}
else
itList++;
}
下面是两个错误的使用方法:
错误使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); itList++)
{
if( WillDelete( *itList) )
{
List.erase( itList);
}
}
或
错误使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( ++itList);
}
else
itList++;
}
正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用 erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
错误使用方法2:同上。
这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法 std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
if( WillDelete( *itVec) )
{
itVec = Vec.erase( itVec);
}
else
itList++;
}
注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。
假如有一个列表 ShipList,里面的内容是0、1、2、3...9, 如果要从中删除那些取余3后为0或为1的数,删除后应该得出的结果是 2、5、8。
但如果是这样操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
这样的话会有两个问题,一个是得出的结果是 1、2、4、5、7、8(没有删除取余3后等于1的数);另外一个问题是当执行到列表中最后一个元素(即ShipList.end() - 1 )时,迭代器可能还会执行两次“++”,如果是这样那么it就到达了 ShipList.end() + 1 的位置,这样也会报错。
erase( itList++) 是先获取下一个元素的位置再删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
我认为,erase(itList++)是itList先传递值给erase(),然后再自增;
erase(++itList) 是先自增,然后再把自增后的值传递给erase(),这个是出错的根源。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}
或
正确使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase( itList++);
}
else
itList++;
}
下面是两个错误的使用方法:
错误使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); itList++)
{
if( WillDelete( *itList) )
{
List.erase( itList);
}
}
或
错误使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( ++itList);
}
else
itList++;
}
正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用 erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
错误使用方法2:同上。
这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法 std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
if( WillDelete( *itVec) )
{
itVec = Vec.erase( itVec);
}
else
itList++;
}
注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。
假如有一个列表 ShipList,里面的内容是0、1、2、3...9, 如果要从中删除那些取余3后为0或为1的数,删除后应该得出的结果是 2、5、8。
但如果是这样操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
这样的话会有两个问题,一个是得出的结果是 1、2、4、5、7、8(没有删除取余3后等于1的数);另外一个问题是当执行到列表中最后一个元素(即ShipList.end() - 1 )时,迭代器可能还会执行两次“++”,如果是这样那么it就到达了 ShipList.end() + 1 的位置,这样也会报错。
erase( itList++) 是先获取下一个元素的位置再删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
我认为,erase(itList++)是itList先传递值给erase(),然后再自增;
erase(++itList) 是先自增,然后再把自增后的值传递给erase(),这个是出错的根源。
发表评论
-
C++内存管理
2011-09-19 10:45 7781 内存管理 伟大的Bill G ... -
调试程序
2011-09-14 16:21 700******************************* ... -
有用的网址
2011-08-04 12:44 605http://searchdns.netcraft.com/ -
vim高级应用
2011-08-04 10:29 988命令模式: “s”为表 ... -
c/c++ 调试
2011-06-08 15:31 812readelf -s a.out 可以查看符号表,就能找到对应 ... -
网站列表
2011-02-25 09:48 665http://www.rosoo.net/ NO ... -
高性能服务器注意事项
2011-01-18 13:09 816对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或 ... -
在 Linux 平台中调试 C/C++ 内存泄漏方法
2010-10-20 15:56 899由于 C 和 C++ 程序中完全由程序员自主申请和释放内存 ... -
用socket编写C/S结构程序的流程图
2010-10-08 17:07 24441.面向连接的套接字的系统调用时序图 无连接协议的套接字调用 ... -
将文件读入内存
2010-09-14 17:35 1091将文本文件读入内存。需要用到fseek、fread和ftell ... -
50 c/c++ 源码网站
2010-08-03 15:47 7701、http://snippets.dzone.com/tag ... -
值得注意的函数
2010-08-03 13:48 536函数 严重性 解决 ... -
调用系统命令
2010-08-02 12:52 614int get_system_info(char* cmdst ... -
结构体对齐
2010-07-30 13:59 12971,比如: struct{ short a1; sh ... -
LINUX c++线程池框架
2010-07-15 11:25 1389本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进 ... -
一个简单的linux线程池
2010-07-12 18:10 958线程池:简单地说,线程池 就是预先创建好一批线程,方便、快速 ... -
文件字符串处理
2010-06-30 09:12 679#include <iostream> #incl ... -
不能用类成员函数作为线程函数
2010-06-29 17:12 834不能用类成员函数作为线程函数 -
c++ 字符串替换
2010-06-24 10:43 962#include <string> #incl ...
相关推荐
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
六一儿童节快乐!(六一儿童节庆祝代码)Vue开发 like Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Lints and fixes files npm run lint Customize configuration
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
NX二次开发uc1603 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。
【目标检测数据集】遥感类军用飞机检测数据集3800张20类别VOC+YOLO格式.zip 数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3821 标注数量(xml文件个数):3821 标注数量(txt文件个数):3821 标注类别数:20 标注类别名称:["A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12","A13","A14","A15","A16","A17","A18","A19","A20"] 每个类别标注的框数: A1 框数 = 1646 A2 框数 = 1726 A3 框数 = 1164 A4 框数 = 642 A5 框数 = 1262 A6 框数 = 436 A7 框数 = 680 A8 框数 = 944 A9 框数 = 1073 A10 框数 = 924 A11 框数 = 501 A12 框数 = 702 A13 框数 = 1652 A14 框数 = 177
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
权重替换:KAN网络通过将权重参数替换为可学习的单变量函数,提高了网络的性能和可解释性。这种设计使得KAN网络在准确性和可解释性方面优于传统的多层感知器(MLP)。 激活函数位置:与传统的MLP不同,KAN网络中的激活函数位于网络的“边”(即权重)上,而不是节点上。这使得KAN网络能够更灵活地调整每个连接上的激活函数,从而提高模型的表示能力。 非线性核函数:KAN网络可以使用非线性核函数来替代MLP“边”上的线性函数,进一步增强了模型的非线性处理能力。 逼近精度:KAN网络可以设定细粒度的结点(Knot)来提高逼近精度,这使得KAN网络在处理复杂任务时能够获得更高的准确度。 KAN网络的数学理论基础主要来自于Kolmogorov-Arnold表示定理。该定理指出,任意一个多变量连续函数都可以表示为有限数量的单变量连续函数的两层嵌套加法的形式。KAN网络正是基于这一定理,通过将多元函数的学习转化为对一组单变量函数的学习,提高了模型的表达能力和计算效率。
MySQL的performance_schema详解.md
基于python的运动员数据分析源码.zip 基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip
内容概要: 这份资源是一份关于“图像的采样与量化”的实验文档,详细记录了在MATLAB环境下进行图像处理的实验过程。文档中介绍了实验的目的、内容、所需仪器与设备,以及实验原理,包括采样和量化的基本概念和它们在图像处理中的重要性。此外,还提供了MATLAB代码示例,展示了如何对图像进行不同程度的采样和量化,并分析了实验结果。 适用人群: 本文档适用于学习数字图像处理的大学生、研究生,以及相关专业的研究人员和开发人员。特别是对MATLAB编程和图像处理技术感兴趣的初学者,可以通过这份文档快速入门并理解图像采样与量化的基本原理。 使用场景及目标: 在学术教学中,作为图像处理课程的实验教材或辅助资料。 作为自学者的实践指南,帮助学习者通过动手实践来掌握图像采样和量化的技能。 为研究人员提供图像处理技术的理论基础和编程实践,以支持更高级的研究工作。
基于云函数的小程序-初恋.rar
V4L2示例代码
机器学习数据 (1)
matlab仿真
这是一款声音模拟器准确说是猫和狗的声音模拟器 该款小程序也就没有后端了 使用方法 直接用微信开发者工具打开源码上传提交审核即可 无需过段复杂的过程,文字图片那些都可以自行修改啥的
该程序是一个数据预处理的模板,它可以生成任意图像对应的二值图。 本代码以甲状腺结节知名数据集DDTI为例子。 代码运行后,你会得到两个文件夹和一个cvs文件: - 这两个文件夹名为 `stage1` 和 `stage2`, 文件夹`stage1`中的数据用于训练第一个网络,该网络包含预处理后的图像,没有不相关区域; `stage2`用于训练第二个网络,该网络包含扩展ROI的图像 - 名为 `train.csv`的cvs文件是下面的这种数据格式,结节的大小是将预处理后的图像统一为256x256像素后,结节的像素数。
Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar Java开发案例-springboot-20-整合Forest实现调用第三方接口-源代码+文档.rar
科帮网javaWeb计算机配件报价系统项目
yolo目标检测onnx模型
android studio android网络视频播放器 android网络视频播放器 android网络视频播放器