之前說過 string和vector一樣,也是一種順序容器,並且它也自帶成員函數,用法和vector的成員函數差不多,不過它只能用來存放字符,也就是字符串。
在c++中,<string>基本上已經包含在<iostream>里面了,但即便如此,在我們用到string類的時候還是要加上頭文件<string>的。
下面介紹一下string對象常用的成員函數。
1.構造函數,有三個常用的
(1) string str1="hello world";
(2) string str2("abcde");
(3) string *str3=new string("12343543");
2. 獲取字符串長度
int len1=str1.length(); //獲取字符串長度
int len2=str1.size(); //獲取string這個容器對象中元素的個數
3. 用 '+' 串聯字符串
在<string>頭文件里對 '+' 進行了重載,可以用來串聯字符串
string str4=str1+str2+str3;
4. [ ] 隨機訪問
在<string>頭文件里對 [ ] 進行了重載,可以用來對字符串對象進行隨機訪問str1[3],包括存取甚至修改操作,類似於數組。
5. 常用的成員函數
push_back();向string容器的末尾位置添加字符
push_pop(); 把string容器里的末尾元素彈出容器,即刪除操作
begin();返回一個指向容器中第一個元素的迭代器
end();返回一個指向容器中最后一個元素的下一個位置的迭代器
rebegin();反向迭代,返回指向最后一個元素的下一個位置的迭代器
rend(); 反向迭代,返回指向第一個元素的的迭代器
front();返回容器中第一個元素的引用,可以對其進行存取及修改操作
back();返回容器中最后一個元素的引用,可以對其進行存取及修改操作
at();此成員函數有參數,參數是下標。的作用類似於[ ]操作符,用來對指定下標位置的元素進行隨機訪問,可進行存取及修改操作
resize(int n, char c);調整容器有效數據尺寸,若尺寸變大,則自動截掉多余的數據;若尺寸變大,則空出的用該函數的第二個參數填充,會影響容器的size。
reserve();為容器預留足夠的空間,避免了不必要的重復分配,分配空間大於等於函數的參數,會影響capacity
find(str, int start);<string>文件對find()進行了重載。在只有一個參數的時候表示在當前字符串里查找某個字符或某個子串,查找成功返回首次出現的位置,查找不成功返回-1。
在有第二個參數的時候且該參數是int型,即指定了查找的起始位置start,表示從該位置start開始查找。
copy();用於拷貝。原型為:int copy(char* buffer, int n, int start ) const;把當前字符串中以start位置開始的n個字符復制到到以buffer為起始位置的字符數組中,返回實際拷貝的數目
str1.swap(str2);交換字符串str1和str2
clear();清空當前string容器
empty();判斷容器是否為空,為空返回1,非空返回0
c_str();返回一個以NULL結束的c語言字符串。原型為:const char* c_str()const;
erase();刪除字符串中的字符,它既可以通過下標也可以通過迭代器來刪除指定位置處的字符,甚至可以刪除某個區間內的所有字符。由於erase()有多種重載,所以給出了具體用法,看下面代碼
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int main() 6 { 7 string str1("123456789"),str2("987654321"); 8 str1.erase(6,1); //第一個參數為起始刪除位置,第二個參數為刪除的元素個數。即從下標為6的位置開始刪除,刪除1個元素 9 cout<<str1<<"\n"; 10 str1.erase(6,2); //第一個參數為起始刪除位置,第二個參數為刪除的元素個數。即從下標為6的位置開始刪除,刪除2個元素 11 cout<<str1<<"\n"; 12 str1.erase(1); //從下標為1的位置開始刪除,刪除下標為1及1之后的所有元素 13 cout<<str1<<"\n"; 14 15 string::iterator iter1,iter2; 16 iter2=str2.end()-1; 17 str2.erase(iter2); //刪除迭代器所指位置的元素 18 cout<<str2<<"\n"; 19 iter1=str2.begin(); 20 iter2=str2.begin()+4; 21 str2.erase(iter1,iter2); //刪除兩個迭代器所指元素之間的所有元素 22 cout<<str2<<"\n"; 23 return 0; 24 }
結果如下:
insert();向當前字符串中指定位置處插入另外一個字符串,insert()有多種重載,具體用法看代碼
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int main() 6 { 7 string str1("123456789"),str2("abcde"); 8 9 str1.insert(8,str2); //把str2插入到str1中下標為8的位置,第一個參數8是插入位置 10 cout<<str1<<"\n"; 11 str1.insert(4,"hello world"); //把指定字符串插入到str1中下標為4的位置 12 cout<<str1<<"\n\n"; 13 14 str1.insert(3,"nihao",4); //在str1中下標為3的位置插入字符串的前4個字符 15 cout<<str1<<"\n\n"; 16 17 str1.insert(1,str2,0,3); //把str2中下標從0開始的前3個字符插入到str1中 18 cout<<str1<<"\n\n"; 19 20 string::iterator iter1,iter2,iter3; 21 iter1=str2.begin(); 22 str2.insert(iter1,'6'); //在iter1所指的位置插入字符'6' 23 cout<<str2<<"\n"; 24 iter1=str2.end()-1; 25 str2.insert(iter1,3,'8'); //在iter1所指的位置插入3個字符'8' 26 cout<<str2<<"\n\n"; 27 28 string str3("xyz"); 29 iter1=str2.end()-1; 30 iter2=str3.begin(); 31 iter3=str3.end()-1; 32 str2.insert(iter1,iter2,iter3); //把iter2和iter3所指位置之間的所有字符都插入到str2中iter1所指的位置 33 cout<<str2<<"\n"; 34 return 0; 35 }
結果如下: