实战c++中的string系列--string的初始化、删除、转大小写(construct erase upper-lower)

来源:互联网 发布:马布里nba数据 编辑:程序博客网 时间:2024/06/14 17:23

string是有迭代器设计模式的,我还没有体会到迭代器带给我的好处,很多时候使用类似数组索引的方法就可以完成任务。

场景1:删除string所有的大写字母
这里用到erase方法:

#include<iostream>  #include<cctype>  #include<string>  using namespace std;  int main()  {    string str = "This IS A  trick";      for(string::iterator iter = str.begin();  iter != str.end();++iter){            if(isupper(*iter)){             str.erase(iter);             --iter;        }    }   for(string::iterator iter = str.begin();    iter != str.end();++iter)    cout<<*iter<<" ";   return 0;  }  

上面的代码会错误,原因之前博客《没有躲过的坑–vector使用erase后迭代器变成野指针》说过,即erase后,迭代器指向的位置。

场景2:初始化string
之前博客讨论过string的初始化问题,朝花夕拾:

#include<iostream>#include<string>using namespace std;int main(){    string s = "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz" + 'A';    int t = 'A';    string s1 = "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz" + t;    cout << t << endl;    cout << s << endl;    cout << s1 << endl;    return 0;}

输出结果出乎意料:
65
tuvwxyz
tuvwxyz

这里需要提醒的是弄清楚字符和字符串的区别,千万别把双引号写成了单引号。
原因:
char 类型转成整形
对const char *进行指针偏移后的指针传给string的构造函数

场景3:string中的字母转大小写
常规的for循环就不写了,直接写一个很少用到的:

#include <iostream>  #include <algorithm>  using namespace std;  int main()  {      string str = "heLLo";  //可以不包含<string>    transform(str.begin(), str.end(), str.begin(), toupper);      cout<<str<<endl;//错误,因为没包含<string>    cout<<str.c_str()<<endl;      transform(str.begin(), str.end(), str.begin(), tolower);      cout<<str.c_str()<<endl;  }

这里需要注意的是,cout不能直接输出string。
这就引出个重要的话题,不包含string头文件,string可以用;包含string头文件,string也可以用?
我猜想是标准库不断更新的原因,也为了兼容之前的老版本

1 0
原创粉丝点击