目錄
string的定義
string中內存的訪問
string常用函數實例解析
string的定義
定義string的方式跟基本類型相同,只需要在string后跟上變量名即可:
string str;
如果要初始化,可以直接給string類型的變量進行賦值:
string str="abcd";
string中內存的訪問
(1)通過下標訪問
一般來說,可以直接像字符數組那樣來訪問string:
#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";for(int i=0;i<str.length();i++){printf("%c",str[i]);}return 0;
}
如果要讀入和輸出整個字符串,則只能用cin和cout
#include<iostream>
#include<string>
using namespace std;
int main(){string str;cin>>str;cout<<str;return 0;
}
上面的代碼對任意的字符串輸入,都會輸出同樣的字符串。
那么,其實也可以使用printf來輸出string,即用c_str()將string類型轉換為字符數組進行輸出。
#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";printf("%s\n",str.c_str());return 0;
}
(2)通過迭代器訪問
一般僅通過(1)即可滿足訪問的要求,但是有些函數比如insert()與erase()則要求以迭代器為參考。
由于string不像其它STL容器那樣需要參數,因此可以直接如下定義:
string::iterator it;
這樣就得到了迭代器it,并且可以通過*it來訪問string里的每一位:
#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";for(string::iterator it=str.begin();it!=str.end();it++){printf("%c",*it);}return 0;
}
最后指出,string和vector一樣,支持直接對迭代器進行加減某個數字,如str.begin()+3的寫法是可行的。
string常用函數實例解析
(1)operator+=
這是string的加法,可以將兩個string直接拼接起來
#include<iostream>
#include<string>
using namespace std;
int main(){string str1="abc",str2="xyz",str3;str3=str1+str2;//將str1和str2拼接起來,賦值給str3str1+=str2;//將str2直接拼接到str1上cout<<str1<<endl;cout<<str3<<endl;return 0;
}
(2)compare operator
兩個string類型可以直接使用==、!=、<、<=、>、>=比較大小,比較規則是字典序。
#include<stdio.h>
#include<string>
using namespace std;
int main(){string str1="aa",str2="aaa",str3="abc",str4="xyz";if(str1<str2){printf("ok1\n");}if(str1!=str3){printf("ok2\n");}if(str4>=str3){printf("ok3\n");}return 0;
}
(3)length()/size()
length()返回string的長度,即存放的字符數,時間復雜度為。size()與length()基本相同。
string str="abcxyz";
printf("%d %d\n",str.length(),str.size());
(4)insert()
string的insert()函數有很多種寫法,這里給出幾個常用的寫法,時間復雜度為。
1.insert(pos,string),在pos號位置插入字符串string
string str="abcxyz",str2="opq";
str.insert(3,str2);
輸出結果
abcopqxyz
2.insert(it,it2,it3)
it為原字符串的欲插入位置,it2和it3為待插字符串的首尾迭代器,用來表示串[it2,it3)將被插在it的位置上。
#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcxyz",str2="opq";//在str的3號位(即c和x之間)插入str2 str.insert(str.begin()+3,str2.begin(),str2.end());cout<<str<<endl;return 0;
}
(5)erase()
erase()有兩種用法:刪除單個元素,刪除一個區間內的所有元素,時間復雜度均為
1.刪除單個元素
str.erase()用于刪除單個元素,it為需要刪除的元素的迭代器
#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(str.begin()+4);cout<<str<<endl;return 0;
}
輸出結果
abcdfg
2.刪除一個區間內的所有元素
刪除一個區間內的所以元素有兩種方法:
str.erase(first,last),其中first為需要刪除的區間的起始迭代器,而last則為需要刪除的區間的末尾迭代器的下一個地址,也即為刪除[first,last)
#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(str.begin()+2,str.end()-1);cout<<str<<endl;return 0;
}
輸出結果?
abg
str.erase(pos,length),其中pos為需要開始刪除的起始位置,length為刪除的字符個數。
#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(3,2);cout<<str<<endl;return 0;
}
輸出結果
abcfg
(6)clear()?
clear()用以清空string中的數據,時間復雜度一般為。
#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";str.clear();printf("%d\n",str.length());return 0;
}
(7)substr()
substr(pos,len)返回從pos號位開始,長度為len的子串,時間復雜度為
#include<iostream>
#include<string>
using namespace std;
int main(){string str="Thank you for your smile.";cout<<str.substr(0,5)<<endl;cout<<str.substr(14,4)<<endl;cout<<str.substr(19,5)<<endl;return 0;
}
輸出結果
Thank
your
smile
(8)string::npos
string::npos是一個常數,其本身的值為-1,但由于是unsigned_int類型,因此實際上也可以認為是unsigned_int類型的最大值。string::npos用以作為find函數失配時的返回值。例如在下面的實例中可以認為string::npos等于-1或者4294967295.
#include<iostream>
#include<string>
using namespace std;
int main(){if(string::npos==-1){cout<<"-1 is true."<<endl;}if(string::npos==4294967295){cout<<"4294967295 is also true."<<endl;}return 0;
}
輸出結果
-1 is true.
4294967295 is also true.
(9)find()
str.find(str2),當str2是str的子串時,返回其在str中第一次出現的位置;如果str2不是str的子串,那么返回string::npos
str.find(str2,pos),從str的pos號位開始匹配str2,返回值與上相同。
時間復雜度為,其中n和m分別是str和str2的長度。
#include<iostream>
#include<string>
using namespace std;
int main(){string str="Thank you for your smile.";string str2="you";string str3="me";if(str.find(str2)!=string::npos){cout<<str.find(str2)<<endl;}if(str.find(str2,7)!=string::npos){cout<<str.find(str2,7)<<endl;}if(str.find(str3)!=string::npos){cout<<str.find(str3)<<endl;}else{cout<<"I know there is no position for me."<<endl;}return 0;
}
輸出結果
6
14
I know there is no position for me.
(10)replace()
str.replace(pos,len,str2)把str從pos號位開始,長度為len的子串替換為str2
str.replace(it1,it2,str2)把str的迭代器[it1,it2)范圍的子串替換為str2
#include<iostream>
#include<string>
using namespace std;
int main(){string str="Maybe you will turn around.";string str2="will not";string str3="surely";cout<<str.replace(10,4,str2)<<endl;cout<<str.replace(str.begin(),str.begin()+5,str3)<<endl;return 0;
}
輸出結果
Maybe you will not turn around.
surely you will not turn around.