C++中string类常⽤函数总结
string类的使⽤
string类的使⽤
必须包含头⽂件 ,string类是⼀个模板类,位于名字空间std中。
#include<string>
using std::string;
⼀. string的构造函数的形式
string str:⽣成空字符串
string s(str):⽣成字符串为str的复制品
string s(str, str_begin,str_len):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值
string s(cstr,char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值
string s(num,char):⽣成num个c字符的字符串
string s(str,str_index):将字符串str中从下标str_index开始到字符串结束的位置作为字符串初值
string str1;//⽣成空字符串
str1 ="Hello World!";
string str2(str1);//⽣成str1的复制品
string str3("12345",0,3);//结果为"123"
string str4("012345",5);//结果为"01234"
string str5(5,'1');//结果为"11111"
string str6(str2,6);//结果为"World!"
char alls[]="All's well that ends well";
string str7(alls,10);//结果为 All's well
string类的输⼊
⼆. string的⼤⼩和容量
size()和length():返回string对象的字符个数,它们执⾏效果相同。length()成员来⾃较早版本的string类,⽽size()则是为提供STL 兼容性⽽设置的。
⼆者的源代码:
_NODISCARD size_type length()const noexcept{// return length of sequence
return_Get_data()._Mysize;
}
_NODISCARD size_type size()const noexcept{// return length of sequence
return_Get_data()._Mysize;
}
由此可见,⼆者的底层原理也是相同的。
max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
capacity():重新分配内存之前,string对象能包含的最⼤字符数,返回当前已为字符串分配空间的字符数。
empty():检查 string 是否⽆字符.若 string 为空则为 true ,否则为 false 。
string s("Hello World!");
cout <<"size="<< s.size()<< endl;// size=12
cout <<"length="<< s.length()<< endl;// length=12
cout <<"max_size="<< s.max_size()<< endl;// max_size=2147483647
cout <<"capacity="<< s.capacity()<< endl;// capacity=15
三. string的字符串⽐较
⽐较操作符: >, >=, <, <=, ==, !=
这些操作符根据“当前字符特性”将字符按字典顺序进⾏逐⼀⽐较,字典排序靠前的字符⼩,⽐较的顺序是从前向后⽐较,遇到不相等的字符就按这个位置上的两个字符的⽐较结果确定两个字符串的⼤⼩(前⾯减后⾯)
成员函数compare()
⽀持多参数处理,⽀持⽤索引值和长度定位⼦串进⾏⽐较,前⾯减去后⾯的ASCII码,>0返回1,<0返回-1,相同返回0
str1pare(str2):compare str1[0, _Mysize) with _Right
str1pare(_Off, _N0, str2):compare str1[_Off, _Off + _N0) with str2
str1pare(_Off, _N0, str2, _Roff, _Count):compare str1[_Off, _Off + _N0) with str2[_Roff, _Roff + _Count)
str1pare(*_Ptr):compare str1[0, _Mysize) with [_Ptr,<null>)
str1pare(_Off, _N0,*_Ptr, _Count):compare str1[_Off, _Off + _N0) with [_Ptr, _Ptr + _Count)
string A("aBcdf");
string B("AbcdF");
string C("123456");
string D("123dfg");
cout <<"Apare(B):"<< Apare(B)<< endl;//"aBcdf"和"AbcdF"⽐较,a>A,返回1
cout <<"Apare(2, 2, B):"<< Apare(2,2, B)<< endl;//"cd"和“AbcdF"⽐较,c>A,返回1
cout <<"Apare(2, 2, B, 2, 2):"<< Apare(2,2, B,2,2)<< endl;//"cd"和“cd"⽐较,返回0
cout <<"Cpare(0, 4, D, 0, 4):"<< Cpare(0,4, D,0,4)<< endl;//"1234"和"123d"⽐较,返回-1
四. string的插⼊:push_back() 和 insert()
// 尾插⼀个字符
s1.push_back('a');
s1.push_back('b');
s1.push_back('c');
cout<<"s1:"<<s1<<endl;// s1:abc
// insert(pos,char):在制定的位置pos前插⼊字符char
s1.insert(s1.begin(),'1');
cout<<"s1:"<<s1<<endl;// s1:1abc
五、string拼接字符串:append() 、 +
//⽅法⼀:append()
string s1("abc");
s1.append("def");
cout<<"s1:"<<s1<<endl;// s1:abcdef
// ⽅法⼆:+ 操作符
string s2 ="abc";
/*s2 += "def";*/
string s3 ="def";
s2 += s3.c_str();
cout<<"s2:"<<s2<<endl;// s2:abcdef
六、 string的遍历:借助迭代器或者下标法
正向迭代器 str.begin()、d()
反向迭代器 str.rbegin()、d()
string s1("abcdef");
// 正向迭代器
string::iterator iter = s1.begin();
for(; iter < s1.end(); iter++)
{
cout<<*iter;
}
cout<<endl;//abcdef
// 反向迭代器
string::reverse_iterator riter = s1.rbegin();
for(; riter < s1.rend(); riter++)
{
cout<<*riter;
}
cout<<endl;//fedcba
七、 string的删除:erase()
iterator erase(iterator p):删除字符串中p所指的字符
iterator erase(iterator first, iterator last):删除字符串中迭代器区间 [first, last) 上所有字符
string& erase(size_t pos, size_t len):删除字符串中从索引位置 pos 开始的 len 个字符
void clear():删除字符串中所有字符
string s1 ="123456789";
⼋、 string的字符替换
string& replace(size_t pos, size_t n, const char s):将当前字符串从pos索引开始的n个字符,替换成字符串s
string& replace(size_t pos, size_t n, size_t n1, char c):将当前字符串从pos索引开始的n个字符,替换成n1个字符c string& replace(iterator i1, iterator i2, const char s):将当前字符串[i1,i2)区间中的字符串替换为字符串s
string s1("hello,world!");
九、string⼤⼩写转换:tolower() 和 toupper() 或者 STL中的 transform 算法
tolower(char) 和 toupper(char) :将字符进⾏⼤⼩写转换
transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func):transform [_First, _Last) with _Func
string s ="ABCDEFG";
for(int i =0; i < s.size(); i++)
{
s[i]=tolower(s[i]);
}
cout << s << endl;//abcdefg
transform(s.begin(), s.end(), s.begin(),::toupper);
cout << s << endl;//"ABCDEFG"
⼗、 string的查:find
string::npos是字符串可存储的最⼤字符数,通常是⽆符号int或⽆符号long的最⼤取值。如果find函数不到,则返回string::npos。。查位置默认从pos=0开始.
find(const string & str,size_type pos = 0) const;
在当前字符串的pos索引位置开始,查⼦串str,返回⼦字符串⾸次出现时其⾸字符的索引。
find (const char* s, size_t pos=0):
在当前字符串的pos索引位置开始,查⼦串s,返回到的位置索引
find (const char* s, size_t pos=0,size_type n):
在当前字符串的pos索引位置开始,查⼦串s的前n个字符组成的⼦字符串,返回⼦字符串⾸次出现时其⾸字符的索引。
find (char c, size_t pos=0):
在当前字符串的pos索引位置开始,查字符c,返回该字符⾸次出现的位置索引
string类还提供了其他相关⽅法,它们的重载函数特征标都与find()⽅法相同:
rfind() :查字符串或者字符最后⼀次出现的位置,也就是从后往前查,与find()相反。
find_first_of() :在字符串中查参数中任何⼀个字符⾸次出现的位置。例如,s=“cobra”,"hark"的各个字母在s中⾸次出现的位置为3(字符r在s中的索引),原理:⽤s中的每个字符(c,o,b,r,a)按顺序
分别与“hark”中的四个字符作对⽐。字符r⾸先匹配上,返回其索引。
int where = s.find_first_of("hark");//3
find_last_of():与find_first_of()功能相同,只是它查的是最后⼀次出现的次数。也就是从后往前对⽐(a,r,b,o,c),结果字符a⾸先匹配上,返回其在s的索引4;
int where = s.find_last_of("hark");//4
find_first_no_of():返回字符串中查第⼀个不包含在参数中的字符,因此下⾯的语句将返回字符c在“cobra”中的位置,因为按照(c,o,b,r,a)顺序,c不在“hark”中。
int where = s.find_first_not_of("hark");//0
rfind (const char* s, size_t pos):在当前字符串的pos索引位置开始,反向查⼦串s,返回到的位置索引
rfind (char c,size_t pos):在当前字符串的pos索引位置开始,反向查字符c,返回到的位置索引
find_first_of (const char* s, size_t pos):在当前字符串的pos索引位置开始,查⼦串s的字符,返回到的位置索引
find_first_not_of (const char* s, size_t pos):在当前字符串的pos索引位置开始,查第⼀个不位于⼦串s的字符,返回到的位置索引
find_last_of(const char* s, size_t pos):在当前字符串的pos索引位置开始,向前查第⼀个位于⼦串s的字符,返回到的位置索引
find_last_not_of (const char* s, size_t pos):在当前字符串的pos索引位置开始,向前查第⼀个不位于⼦串s的字符,返回到的位置索引
string s("dog bird chicken bird cat");
//字符串查-----到后返回⾸字母在字符串中的下标
// 1. 查⼀个字符串
cout << s.find("chicken")<< endl;// 结果是:9
// 2. 从下标为6开始字符'i',返回到的第⼀个i的下标
cout << s.find('i',6)<< endl;// 结果是:11
/
/ 3. 从字符串的末尾开始查字符串,返回的还是⾸字母在字符串中的下标
cout << s.rfind("chicken")<< endl;// 结果是:9
// 4. 从字符串的末尾开始查字符
cout << s.rfind('i')<< endl;// 结果是:18
// 5. 在该字符串中查第⼀个属于字符串s的字符
cout << s.find_first_of("13br98")<< endl;// 结果是:4("b")
// 6. 在该字符串中查第⼀个不属于字符串s的字符,先匹配dog,然后bird匹配不到,所以打印4
cout << s.find_first_not_of("hello dog 2006")<< endl;// 结果是:4
// 7. 在该字符串从后往前查第⼀个属于字符串s的字符
cout << s.find_last_of("13r98")<< endl;// 结果是:19
// 8. 在该字符串从后往前查第⼀个不属于字符串s的字符,先匹配tac,然后空格匹配不到,所以打印21 cout << s.find_last_not_of("teac")<< endl;// 结果是:21
⼗⼀、 string的排序
sort(iterator iter1, iterator iter2):对[iter1, iter2)进⾏排序
string s ="cdbaef";
sort(s.begin(), s.begin()+3);
cout <<"s:"<< s << endl;//s:bcdaef
⼗⼆、 string的分割/截取字符串:substr()
string s1("0123456789");
string s2 = s1.substr(2,5);
cout << s2 << endl;// 结果:23456,参数5表⽰截取的字符串的长度
string str("I,am,a,student; hello world!");c++string类型
string split(",; !");
int iCurrentIndex =0;
int iSplitIndex;
while(iCurrentIndex < str.size()){
iSplitIndex = str.find_first_of(split, iCurrentIndex);
if(iSplitIndex ==-1)
iSplitIndex = str.size();
if(iSplitIndex != iCurrentIndex)
cout << str.substr(iCurrentIndex, iSplitIndex - iCurrentIndex)<< endl;
iCurrentIndex = iSplitIndex +1;
}
/**********************************
结果:
I
am
a
student
hello
world
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论