深入解析C++ vector 删除操作:从基础到高级 (深入解析css)
在C++中,vector是一个动态数组,它可以自动增长和缩小以容纳其元素。vector提供了许多有用的操作,其中包括删除元素的操作。本文将深入解析C++ vector中的删除操作,从基础知识到高级用法。
基础知识
最基本的删除操作是
erase()
函数,它从vector中删除一个或多个元素。
erase()
函数有两种重载形式:
-
erase(iterator it)
:从vector中删除由迭代器it指向的元素。 -
erase(iterator begin, iterator end)
:从vector中删除从begin到end(不包括end)的元素。
例如,以下代码使用
erase()
函数从vector中删除index为0的元素:
includeint main() {std::vector v = {1, 2, 3, 4, 5};v.erase(v.begin());return 0;}
执行此代码后,vector将变为{2, 3, 4, 5}。
高级用法
除了基本的
erase()
函数外,vector还提供了其他一些删除操作,这些操作允许在特定情况下更有效地删除元素。
clear() 函数
clear()
函数从vector中删除所有元素,而不影响其容量。与
erase()
函数不同,
clear()
函数不会重新分配vector的底层存储空间。因此,
clear()
函数在删除vector中的所有元素时比
erase()
函数更有效率。
例如,以下代码使用
clear()
函数从vector中删除所有元素:
includeint main() {std::vector v = {1, 2, 3, 4, 5};v.clear();return 0;}
执行此代码后,vector将变为空vector。
pop_back() 函数
pop_back()
函数从vector中删除最后一个元素。与
erase()
函数不同,
pop_back()
函数不会重新分配vector的底层存储空间。因此,
pop_back()
函数在删除vector的最后一个元素时比
erase()
函数更有效率。
例如,以下代码使用
pop_back()
函数从vector中删除最后一个元素:
includeint main() {std::vector v = {1, 2, 3, 4, 5};v.pop_back();return 0;}
执行此代码后,vector将变为{1, 2, 3, 4}。
resize() 函数
resize()
函数改变vector的size。如果new_size小于vector的当前size,则
resize()
函数会从vector中删除超出new_size的部分元素。与
erase()
函数不同,
resize()
函数不会重新分配vector的底层存储空间。因此,当减少vector的size时,
resize()
函数比
erase()
函数更有效率。
例如,以下代码使用
resize()
函数将vector的size减少到3:
includeint main() {std::vector v = {1, 2, 3, 4, 5};v.resize(3);return 0;}
执行此代码后,vector将变为{1, 2, 3}。
效率注意事项
在使用vector的删除操作时,需要注意以下效率注意事项:
-
erase()
函数的复杂度为O(n),其中n是需要删除的元素的数量。这是因为erase()
函数需要移动vector中所有剩余的元素以填补被删除元素留下的空隙。 -
clear()
函数的复杂度为O(1)。这是因为clear()
函数不会重新分配vector的底层存储空间。 -
pop_back()
函数的复杂度为O(1)。这是因为pop_back()
函数只需要删除vector的最后一个元素,而不需要移动vector中的任何其他元素。 -
resize()
函数的复杂度为O(n),其中n是vector的当前size和new_size之间的差值。这是因为resize()
函数需要移动vector中所有剩余的元素以适应新的size。
根据需要删除元素的数量和vector的当前size,选择最合适的删除操作非常重要。对于删除大量元素,
clear()
函数通常是最佳选择。对于删除vector的最后一个元素,
pop_back()
函数是最佳选择。对于将vector的size减小到较小的值,
resize()
函数通常是最佳选择。
结论
C++ vector提供了多种删除操作,以满足各种需求。了解这些操作的基础知识和高级用法对于高效地管理vector中的数据非常重要。通过正确选择删除操作,可以优化vector的性能并避免不必要的开销。
有了C和C++基础要学Java的话看那些书比较合适呢?
java的内容比C简单多了,去除了很多C/C++中容易出错的地方,如指针等,减轻学习负担,所以有C的基础能很快就能学会(不过C中没有类的概念,C++中有,有C++的基础更容易上手点)。 java的核心在于类,所有的东西都封装在类中,包括main函数,因此建议把类学好。 介绍几本java的书:java语言程序设计(基础篇、进阶篇)。 java的书没什么太经典的,如果要基础的书,我认为这2本还是比较合适的,也足够了。 java编程思想。 这本书比较经典,但是最好能有最基本的基础后再来看这本书。 java的重点在于类,把类学好,重载、继承等等,学扎实了,后面才有提高。 这本书基本上将java的原理讲的很透彻。 java官方API文档。 没有比这更好的资料了,官方文档,详细介绍了java官方提供的所有类、接口、方法。 不论学什么语言,要想深入及提高,就必须去看官方文档。 不过官方文档更多的在于应用,没什么原理。 建议用到什么,查什么。 java比其他语言更简单,因此更容易制作很多高效的软件工程工具,如单元测试、重构等,有了扎实的基础,去学习一下这些东西可以提高编程的水平、效率和质量。 设计模式,非常经典,但非常抽象。 不过要想在面向对象语言上编程有所提高,这是必备的。 而且学了这个你会发现与C这种面向过程的语言的明显不同。 《设计模式》(人称GOF) 、《head first设计模式》重构,有人说重构是现代软件的面包和水,几乎天天用到,看似感觉不到重要性,但又十分重要。 重构主要是调整程序的结构,使得软件更容易面对变化。 《重构:改善既有代码的设计》单元测试工具Junit、UML工具等,很有必要去学。 编程其实没有难度,特别是java这种简单的语言,非常容易上手。 去学习设计模式等这些东西我认为更有用些,当然前提是有扎实的基础。
怎样对QVector进行添加和删除操作,该怎么处理
下面的例子就是对数据库进行添加删除修改的操作:Private Sub Command1_Click()For i = 0 To 5Text1(i) = Next = select * from & s1 & order by 编号 > 0 1(0) = G + Format((Val(Right(Trim((编号)), 4)) + 1), 0000)ElseText1(0) = G0001End IfEnd SubPrivate Sub Command2_Click()If = False Thenc = MsgBox(您确认要删除该记录吗?, vbOKCancel, 删除提示信息)If c = vbOK = select * from 人员表 IfElseMsgBox 当前数据库中没有可删除的数据记录, vbOKOnly, 提示信息End IfEnd SubPrivate Sub Command3_Click()If Text1(0) = Or Text1(1) = ThenMsgBox 请选择需要改动的记录信息!, vbOKOnly, 错误提示Elsec = MsgBox(确定要修改该记录吗?, vbOKCancel, 提示信息)If c = vbOK Then 如果确认修改的话进行修改操作If Text1(1) = ThenMsgBox 姓名不能为空值!, 48, 修改****Else连接所要修改的数据库 Provider=SQLOLEDB.1;Password=2752;Persist Security Info=True;User ID=sa;Initial Catalog=sample;Data Source=JAMLEEPC开始修改数据库 (UPDATE & s1 & SET 姓名= & Text1(1) & ,年龄= & Text1(2) & ,学历= & Text1(3) & ,年级= & Text1(4) & , 入学时间= & Text1(5) & where 编号= & Trim(Text1(0)) & )MsgBox 信息修改成功, 64, 修改**** = select * from 人员表 IfEnd IfEnd IfEnd SubPrivate Sub Command4_Click() = select * from 人员表 where 编号= + Text1(0) + > 0 ThenMsgBox 该信息已存在,信息保存不成功, 64, 保存****Elsecc = MsgBox(您确定要保存该信息吗?, 33, 信息保存提示)If cc = vbOK ThenIf Text1(1) = Or Text1(2) = Or Text1(3) = Or Text1(4) = Or Text1(5) = ThenMsgBox 请确认,人员的姓名、年龄、学历、年级和入学时间不能为空, 48, 保存**** Provider=SQLOLEDB.1;Password=2752;Persist Security Info=True;User ID=sa;Initial Catalog=sample;Data Source= (insert into 人员表 values( & Text1(0) & , & Text1(1) & , & Text1(2) & , & Text1(3) & , & Text1(4) & , & Text1(5) & ))MsgBox 信息修改成功, 64, 修改**** = select * from 人员表 IfElseEnd IfEnd IfSet = Adodc1End Sub希望我的回答可以帮到您哦
实验二 学生成绩管理系统 一、实验目的 使用标准C或C++实现学生成绩管理系统的录入、查询、删除、统计等基
/*这段程序暂时可以时间学生信息的录入,学生信息的显示,和按照平均成绩的由高到低的来显示学生信息。 其他部分也大同小异,你自己试试吧。 我刚回答了一个同样的问题,呵呵,顺便就都回答了吧。 程序可以运行Enterstudent函数实现学生信息的录入,showStudent实现学生信息的显示,paixu实现成绩由高到低排序显示。 */#include <iostream>#include <vector>#include <ctime>using namespace std;typedef struct St1 { char IDNumber[16];/*学号*/ char FamilyName[16]; /*姓*/ char GivenName[16]; /*名*/ int sex; /*性别(0代表“女”,1代表“男”)*/ int BirthYear; /*出生年*/ int BirthMonth; /*出生月*/ int BirthDay; /*出生日*/ float score[4]; /*成绩*/ float sum; /*总分*/ float average; /*平均分*/}StudentNode;void Enterstudent(vector<StudentNode>& student);int JudgeSex(int sex);void showStudent(vector<StudentNode>& student);int JudgeMouth(int mouth);void paixu(vector<StudentNode>& student); void main(){ vector<StudentNode> student; Enterstudent(student); cout<<显示学生信息<<endl; showStudent(student); cout<<成绩由高到低输出<<endl; paixu(student);} void Enterstudent(vector<StudentNode>& student){// int icount = 0; char cControl = 0; StudentNode stu; while (true) {cout<<录入学生信息,输入e录入结束:<<endl;cin>>cControl;if (e == cControl){ break;}else{ cout<<学号:; cin>>; cout<<姓:; cin>>; cout<<名:; cin>>; cout<<性别:; cin>>; if (JudgeSex()) {cout<<Wrong sex!<<endl;cout<<重新输入<<endl;continue; } cout<<出生年:; cin>>;/* if () {cout<<Wrong year<<endl;cout<<重新输入<<endl;continue; }*/ cout<<出生月:; cin>>; cout<<出生日:; cin>>; cout<<四科成绩:; cin>>[0]; cin>>[1]; cin>>[2]; cin>>[3]; for (int iloop = 0; iloop < 4; ++iloop) { = [iloop]; } = / 4; _back(stu);} }}void showStudent(vector<StudentNode>& student){ for (int iloop = 0; iloop < (); ++iloop) {cout<<学号:<<student[iloop]<<endl;cout<<姓:<<student[iloop]<<endl;cout<<名:<<student[iloop]<<endl;cout<<出生年:<<student[iloop]<<endl;cout<<各门成绩:<<student[iloop][0]<<,<<student[iloop][1]<< ,<<student[iloop][2]<<,<<student[iloop][3]<<endl;cout<<平均成绩:<<student[iloop]<<endl;cout<<endl; }}int JudgeSex(int sex){ if (sex == 0 || sex == 1) {return 0; } elsereturn 1;}/*int JudgeYear(int year){ struct tm* ptm; long ts; inty; ts= time(NULL); ptm = localtime(&ts); y = ptm-> tm_year+1900; //年 if (year < y) {return 1; } elsereturn 0;}*/int JudgeMouth(int mouth){ if (mouth > 12) {return 1; } else {return 0; }}void paixu(vector<StudentNode>& student){ StudentNode stu; for (int iloop = 0; iloop < () - 1; ++iloop) {int jloop = iloop + 1;int k = iloop;for (;jloop < ();++jloop){ if (student[iloop] < student[jloop]) {stu = student[iloop];student[iloop] = student[jloop];student[jloop] = stu; }} } showStudent(student);}
若对本页面资源感兴趣,请点击下方或右方图片,注册登录后
搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源
如有其他疑问,请咨询右下角【在线客服】,谢谢支持!
相关文章
- 2023 显卡买家指南:顶级 GPU 为游戏、内容创作和挖矿推荐 (2023显卡天梯图)
- GPU终极 PK:从入门到旗舰的显卡性能天梯图 (gpuzhot spot)
- 史上最全显卡大排名:最强悍的图形处理器对比 (史上最全显卡品牌)
- 使用 Microsoft Office 2003 官方免费版成为生产力大师 (使用MICROSOFT账户登录什么意思)
- 省钱必读:免费获取 Microsoft Office 2003 官方版本的最佳秘诀 (免费的免是什么意思?)
- Microsoft Office 2003 免费官方版:骗局还是忠告? (microsoft)
- 微软秘密大公开:如何合法免费获取 Office 2003 (微软的秘密)
- 无需化钱:免费下载 Microsoft Office 2003 官方版本的完整教程 (不用花钱的)
- 破解代码:获取完全免费的 Microsoft Office 2003 官方版本 (破解代码是什么意思)
- 揭秘免费获得 Microsoft Office 2003 的合法方法 (揭秘免费获得皮肤软件)
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~