##实战c++中的string系列--string的初始化、删除、转大小写(construct erase upper-lower)
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也可以用?
我猜想是标准库不断更新的原因,也为了兼容之前的老版本
- 前言
- string与整型或浮点型互转
- 指定浮点数有效数字并转为string
- string的替换、查找(一些与路径相关的操作)
- string的分割、替换(类似string.split或是explode())
- string的初始化、删除、转大小写(construct erase upper-lower)
- string的遍历(使用下标还是iterator)
- std::string与MFC中CString的转换
- string到LPCWSTR的转换
- std:vector<char> 和std:string相互转换(vector to stringstream)
- CDuiString和string的转换(duilib中的cduistring)
- string的连接(+= or append or push_back)
- 函数返回局部变量string(引用局部string,局部string的.c_str()函数)
- 将string用于switch语句(c++做C#的事儿, switch中break还是return厉害)
- 不要使用memset初始化string(一定别这么干)