二、string基本字符系列容器
簡介:C語言只提供了一個char類型來處理字符,而對于字符串,只能通過字符串數組來處理,顯得十分不方便。C++STL提供了string基本字符系列容器來處理字符串,可以把string理解為字符串類,它提供了添加、刪除、替換、查找和比較等豐富的方法。string對象的元素下標也是從0開始的。
其中vector< char >這樣的向量也可以處理字符串,但其功能比不上string。向量的元素類型可以是string,如vector< string >這樣的向量,實際上就類似于C語言中的字符串數組。使用string容器,需要在頭文件聲明, #include< string >。
函數方法總結:
1,從string對象尾部添加字符 采用 “+” 操作符
2,從string對象尾部追加字符串
?直接采用“+”操作符
?采用append()方法
3,給string對象插入字符 insert();
4,訪問string對象的元素,一般使用下標方法隨機訪問string對象的元素,下標是從0開始計數的;string對象的元素是一個字符(char)
5,刪除string對象的元素
?清空一個字符串,直接給它賦值為 空字符串 即可
?使用clear();方法刪除string對象的所有元素
?使用erase();方法刪除迭代器所指的那個元素或一個區間中的所有元素。
6,返回string對象的長度
?返回字符串的長度 length();
?返回字符串是否為空 empty();(bool類型)
7,替換string對象的字符 replace();
8,搜索string對象的元素或子串 find();
9,string對象的比較 compare(); (它比對方大返回1,相等返回0,小于對方返回-1)
10,反向排序string對象 reserve();
(使用reserve方法需要聲明頭文件 #include < algorithm>)
11,string對象作為vector向量的元素,類似于字符串數組
12,string類型的數字化處理
13,string對象與字符數組互操作
14,string對象與sscanf函數
15,string對象與數值相互轉換
1,string基本字符系列容器的一些基本操作
#include <iostream>
#include<string>
#include<stdio.h>//使用C語言中的scanf函數
using namespace std;int main()
{string s; //創建一個空字符串對象s,其長度為0cout << s.length() << " ";cout << endl;string s1;s1="beyondwsq"; //直接給字符串對象s1賦值cout << s1 << " ";cout << endl;string s2;char ss2[100];//cin >> ss2;scanf("%s",&ss2);//scanf的輸入速度要比cin快得多,但是scanf是C語言的函數,不支持string對象,需要頭文件 #include<stdio.h>//手動輸入一個字符串到字符數組ss2里面s2=ss2;//將字符數組ss2里面的元素賦值給string類型的s2cout << s2 << " ";//輸出s2這個字符串cout << endl;return 0;
}
2,一些函數方法的使用
#include <iostream>
#include<string>
using namespace std;int main()
{//使用 + 操作符從string對象尾部追加字符串string s;s =s + 'a';s =s + 'b';s =s + 'c'; //不能簡寫成 s=+'c'; 這樣的話只能輸出最后一個字符cout << s << " "; //這里若簡寫成 s=s+'...' 的話只能輸出最后一個字符,我也不知道為什么???cout << endl;//輸出結果:abc//使用 + 操作符從string對象尾部追加字符串string s1;s1 = s1 + "wsq";s1 = s1 + "1014";cout << s1 << " ";cout << endl;//輸出結果:wsq1014//采用append()方法從string對象尾部追加字符串string s2;s2.append("yy");s2.append("1202");cout << s2 << " ";cout << endl;//輸出結果:yy1210//采用insert()方法給string對象插入字符string s3;s3 = "787084934";string :: iterator it; //定義迭代器it = s3.begin(); //迭代器位置為字符串首s3.insert(it+1,'Q'); //把字符'Q'插入到第二個字符的位置,即下標為1這個位置cout << s3 << " ";cout << endl;//輸出結果:7Q87084934//訪問string對象的元素string s4;s4 = "beyondwsq1014";cout << s4[0] << " "; //輸出string對象s4的首元素cout <<endl;cout << s4[0]-'b' << " "; //兩個相同的字符相減值為0cout <<endl;//輸出結果:b 0return 0;
}
3,刪除string對象的元素
#include <iostream>
#include<string>
using namespace std;int main()
{string s;s="beyondwsq1014";string :: iterator it = s.begin(); //定義迭代器it,指向字符串對象首元素s.erase(it+3); //刪除下標為3的元素,即第4個源0cout << s << endl;//輸出結果為:beyndwsq1014s.erase(it,it+4); // 刪除下標為[0~4)直接的所有元素,即 元素 beyncout << s << endl;//輸出結果為:dwsq1014//s=""; //清空字符串長度s.clear(); //清空字符串長度,這兩種方法效果一樣cout << s.length() <<" "; //輸出字符串的長度cout << s.empty() <<endl; //判斷字符串是否為空,若我為空,返回1;不為空返回0//輸出結果為:0 0return 0;
}
4,替換、搜索、比較string對象的元素
#include <iostream>
#include<string>
using namespace std;int main()
{//替換string對象的字符string s;s="beyondwsq1014";s.replace(3,4,"sole"); //從下標為3的元素開始,之后的連續的4個字符也就是下標為[3,6]的元素ondw,替換成“good”cout << s << endl;//輸出結果為:beysolesq104//搜索string對象的元素或子串string s1;s1 = "Never give up";cout << s1.find('e') << " "; //查找第一個字符'e',返回其下標值cout << s1.find("up") <<" "; //查找第一個字符串"up",返回第一個元素(u)的下標值cout << s1.find("are") <<endl; //查找第一個字符串"are",返回其下標值,查找不到則返回4294967295//輸出結果:1 11 4294967295//string對象的比較string s2;s2 = "xi ha xi ha";cout << s2.compare("xi") <<" "; //前兩個元素一樣,但是s2的元素多,所以s2大,返回其他多余的元素的總個數,這里除了“xi”以外,還有9個元素,故返回9cout << s2.compare("xi ha xi ha") <<" "; //相等,返回0cout << s2.compare("zz") <<endl; //x沒有z大,故返回-1//輸出結果:9 0 -1return 0;
}
5,reserve反向排序string對象
#include <iostream>
#include<string>
#include<algorithm> //使用reverse函數方法需要聲明頭文件
using namespace std;int main()
{string s;s = "10141202";reverse(s.begin(),s.end()); //從string對象s的開始到結尾這個區間內,所以的元素進行反排序cout << s << " ";//輸出結果:20214101return 0;
}
6,string類型容器的其他功能
#include <iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<algorithm>
#include<stdio.h> //這里要用到C語言中的scanf函數
using namespace std;int main()
{vector < string > v;v.push_back("hjj");v.push_back("xgz");v.push_back("ysrwsq");cout << v[0] <<" ";cout << v[1] <<" ";cout << v[2] <<endl;//輸出結果:hjj xqz ysrwsqcout << v[0][0] <<" ";cout << v[1][1] <<" ";cout << v[2][2] <<endl;//輸出結果:h j rcout << v[2].length() <<endl;//輸出結果:6//string類型的數字化處理//求一個整數各個位之和,例如12345 輸出結果為(1+2+3+4+5):15string s;s = "787084934";int sum=0;for(int i=0;i<s.length();i++){if(s[i] == '0') sum+=0;else if(s[i] == '1') sum+=1;else if(s[i] == '2') sum+=2;else if(s[i] == '3') sum+=3;else if(s[i] == '4') sum+=4;else if(s[i] == '5') sum+=5;else if(s[i] == '6') sum+=6;else if(s[i] == '7') sum+=7;else if(s[i] == '8') sum+=8;else if(s[i] == '9') sum+=9;}cout << sum <<endl;//輸出結果:50//string對象與字符數組互操作string s1;char ss1[100];scanf("%s",&ss1);s1=ss1;printf(s1.c_str());cout << endl;cout << ss1 <<endl;printf("%s",ss1);cout << endl;cout << s1 <<endl;cout << ss1 <<endl;printf("%s",ss1);cout << endl;//輸出結果:若111 則輸出111五次,每行一次return 0;
}
7,string對象與sscanf函數(可以把一個字符串按你需要的方式分離出子串,甚至是數字)
#include <iostream>
#include <string>
using namespace std;int main()
{string s1,s2,s3;char sa[50],sb[50],sc[50];sscanf("abc 123 sq ","%s %s %s",sa,sb,sc);s1=sa;s2=sb;s3=sc;cout << s1 <<" "<<s2 <<" "<<s3<<endl;cout << "Hello world!" << endl;return 0;
}