多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
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后迭代器变成野指针](http://blog.csdn.net/wangshubo1989/article/details/50121059 "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也可以用? 我猜想是标准库不断更新的原因,也为了兼容之前的老版本