it++

C++中list的erase()函数问题

自作多情 提交于 2020-08-14 06:03:04
典型错误 for(list::iterator it=li.begin();it!=li.end();it++){ li.erase(it); } 问题: 该程序不能跳出循环 原因: li.erase(it);每次做erase时都有可能使迭代器失效,it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。 因为,当list执行erase函数后,会删除对应it的元素,这时迭代器it自动更新为下一个元素的地址(下一个指删除元素的下一个)。这时再执行it++,就会把 迭代器it指向删除元素的下下个,导致最终失效,因为跳过一个元素。 正确写法有: while{ it!= li.end(); ){ if (*it % 2) { li.erase(it++); //在删除it还在时,对其++ } else { it++; } }  或者: while { it!= li.end(); ){ if (*it % 2 ) { it = li.erase(it); //erase函数返回值为删除元素的下一个元素的迭代器(其实就是一个指针),把它赋值给it,就相当于++了。我更喜欢第一种写法。 } else { it ++ ; } }   来源: oschina 链接: https://my.oschina.net/u/4385631/blog

【c++】删除string中指定的字符

爷,独闯天下 提交于 2020-05-03 15:56:26
使用string::iterator(字符串迭代器)从开始 str.begin() 迭代到最后 str.end() ,再使用 string.erase(const_iterator p) 函数来删除迭代器所指向的字符。 #include <iostream> #include < string > using namespace std; int main() { string str; char ch; cin >> str; cin >> ch; string ::iterator it; for (it = str.begin(); it < str.end(); it++ ) { if (*it == ch) { str.erase(it); it -- ; /* it--很重要,因为使用erase()删除it指向的字符后,后面的字符就移了过来, it指向的位置就被后一个字符填充了,而for语句最后的it++,又使it向后移 了一个位置,所以就忽略掉了填充过来的这个字符。在这加上it--后就和for 语句的it++抵消了,使迭代器能够访问所有的字符。 */ } } cout << str; return 0 ; } 来源: oschina 链接: https://my.oschina.net/u/4383327/blog/4262730

ccf--20140303--命令行选项

走远了吗. 提交于 2020-05-02 16:57:41
本题是常规思路,这里要注意: 1)带参命令没有参数和参数错误时终止 2)命令不存在时终止 3)命令都是错误的,不以—开头。 题目和代码如下: 问题描述 试题编号: 201403-3 试题名称: 命令行选项 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。   选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。   该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。  

CCF 201403-3 命令行选项

隐身守侯 提交于 2020-05-02 15:58:37
问题描述 试题编号: 201403-3 试题名称: 命令行选项 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。   选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。   该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。   命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项

PAT甲级考前整理(2019年3月备考)之二,持续更新中.....

一笑奈何 提交于 2020-04-29 18:57:15
PAT甲级考前整理之一网址: https://www.cnblogs.com/jlyg/p/7525244.html ,主要总结了前面131题的类型以及易错题及坑点。 PAT甲级考前整理三网址: https://www.cnblogs.com/jlyg/p/10364727.html 主要是讲132题开始的题目。 考前注意:   1、写函数(有返回值的函数)容易忘记返回值,可能本地运行没问题,但是提交了就会有问题。   2、不要把strlen()函数写到for、while的循环中,有时候会超时,最好是 int len = strlen(str);提前求出来。   3、用sort比较的时候,比较函数 int comp(const ST& st1,const ST& st2);如果在comp中调用ST的fun函数,fun函数必须加上const,例子 int fun()const{return 0;}   4、二位数组初始化不要直接赋值,比如int a[10][10] ={0},是错误的,应该使用memset(a,0,sizeof(a));(一维数组也最好不要直接复制,通过循环复制最好)   5、不要使用gets,PAT系统不支持。可以使用fprintf,使用fprintf注意最后一个字符是'\n',特别是比较的时候就不相等了。使用这一类函数时,注意需要把前一个输入的'\n

BASIC-12 十六进制转八进制(模拟)

时光总嘲笑我的痴心妄想 提交于 2020-04-29 18:15:37
问题描述   给定n个十六进制正整数,输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式   输出n行,每行为输入对应的八进制正整数。    【注意 】   输入的十六进制数不会有前导0,比如012A。   输出的八进制数也不能有前导0。 样例输入   2   39   123ABC 样例输出   71   4435274    【 提示 】   先将十六进制数转换成某进制数,再由某进制数转换成八进制。 解题思路:由输入的格式长度决定无法通过整数型变量进行运算,而提示给出先转换进制,首先想到十六进制和八进制对于二进制都有很方便的计算方法,由此为思路解决。 1 #include<cstdio> 2 #include< string > 3 #include<vector> 4 using namespace std; 5 6 int main( void ) 7 { 8 int n; 9 char c; 10 scanf( " %d " , & n); 11 for ( int i = 0 ; i < n; i++ ){ 12 vector< char > s1; 13 int count = 0 ; 14

【PAT】1015 德才论 (25)(25 分)

折月煮酒 提交于 2020-04-26 05:34:43
  1015 德才论 (25)(25 分) 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。” 现给出一批考生的德才分数,请根据司马光的理论给出录取排名。 输入格式: 输入第1行给出3个正整数,分别为:N(<=10^5^),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。 随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。 输出格式: 输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。 输入样例

STL之<string>

房东的猫 提交于 2020-04-06 10:04:03
为什么要写STL浅谈这个系列,因为最近我在准备蓝桥杯,刷题的时候经常要用到STL,准备补一补,但一直没有找到一个好的视频和资料,最开始准备跟着c语言中文网学,但觉得太繁杂了,最后在b站(b站上计算机类的教学视频挺多的)上找了一个视频学的。这个系列相当于我的一个整理。 这个系列只是浅谈,但刷题应该够了。 今天讲<string>,直接上代码(本人文采有限,习惯代码+注释)。 #include<iostream> #include < string > using namespace std; int main() { // 输入输出 string str1; // cin>>str1; // 无法输入有空格的字符串 // cout<<str1<<endl; getline(cin, str1); // 输入一行字符串 cout << str1 << endl; // 字符串拼接 string str2 = " hello " ; str2 += " world! " ; cout << str2 << endl; // str2="hello wrold!" // 字符串删除指定元素 str2.erase(str2.begin() + 1 ); // 删除元素'e' /* string.begin()头迭代器,指向第一个元素 string.end()尾迭代器