##實戰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(一定別這么干)