C++中string的最强总结

写在前面:
此表方便快速查看各个函数的功能,详细解释以及功能测试后面均会测试

string函数表:

函数函数说明
size()、length()返回字符数量
max_size()返回字符的可能最大个数
empty()判断字符串是否为空,是空时返回ture,不是空时返回false
capacity()返回重新分配之前的字符容量
reserve()保留一定量内存以容纳一定数量的字符
resize()用来重新分配字符串的大小
=、assign()赋以新值
swap()交换两个字符串的内容
+=、append()、push_back()在尾部添加字符
insert()插入字符
erase()删除字符
pop_back()删除尾字符
clear()清空全部字符
replace()替换字符
+串联字符串
==、!=、<、<=、>、>=、compare()比较字符串
[]、at()存取单一字符
>>、getline()从stream读取某值
<<将谋值写入stream
copy()将某值赋值为一个C_string
c_str()、data()将内容以字符数组形式(char *)返回
substr()返回某个子字符串
find()、rfind()、find_first_of()、find_last_of()、find_first_not_of()、find_last_not_of()搜索与查找字符串
begin() end()提供类似STL的迭代器支持
rbegin() rend()逆向迭代器
get_allocator()返回配置器

一、string对象的构造

/*string的一般构造方法*/
string s1;			//默认初始化,s1是一个空串			
string s2(s1);			//s2是s1的副本
string s2=s1;			//等价于s2(s1),s2是s1的副本
string s3("value");		//s3是字面值"value"的副本,除了字面值最后的那个空字符\0外
string s3="value";		//等价于s3("value"),s3是字面值"value"的副本
string s4(n,'c');		//把s4初始化为由连续n个字符c组成的串

/*string的其他构造方法*/
/*注意:n,len2和pos2都是无符号值(unsigned int)*/
string s(cp,n);			//s是cp指向的数组中的前n个字符的拷贝。此数组至少应该包含有n个字符
string s(s2,pos2);		//s是string s2从下标pos2开始的字符拷贝。若pos2>s2.size(),则此构造函数未定义
string s(s2,pos2,len2);		//s是string s2从下标pos2开始len2个字符的拷贝。若pos2>s2.size(),则此构造函数无意义。不管len2的值是多少,构造函数至多拷贝s2.size()-pos2个字符

/*使用STL迭代器初始化string对象*/
string s1(s2.begin(),s2.end());	//使用s2的字符串初始化s1,注意区间范围[s2.begin(),s2.end()),右开左闭区间,右边的值取不到

注:所有字符串后编译器都会为其自动添加空字符\0,使用size()或者lenth()测量的是空字符\0之前的字符数。


测试代码如下:

void test1()
{
 string s1;      //s1空字符串
 string s2 = "value";   //s2为字面值value的拷贝
 string s3(10, 'A');    //s3为10个A
 const char *cp = "hello,world!";
 string s4(cp, 5);    //s4为hello,拷贝cp的前5个字符
 string s5(s3, 0);    //s5为s3从下标0的拷贝
 string s6(s3, 0, 5);   //s6为s3从下标0开始的5个字符
 string s7(s4.begin(), s4.end()); //s7为s4的拷贝
 cout << "s1:" << s1 << endl;
 cout << "s2:" << s2 << endl;
 cout << "s3:" << s3 << endl;
 cout << "s4:" << s4 << endl;
 cout << "s5:" << s5 << endl;
 cout << "s6:" << s6 << endl;
 cout << "s7:" << s7 << endl;
}

运行结果如下:
在这里插入图片描述

二、string对象的容量

s.size():返回string对象的大小,即string对象中的字符数。

s.length():与size()一样都是返回string对象中的字符个数。

s.max_size():返回的是string对象最多包含的字符数,超出会抛出length_error异常。

s.capacity(): 不分配内存的话,s可以保存的字符数。

s.reserve(n):分配至少能容纳n个元素的内存空间。reserve并不能影响s中的字符数,但是可以影响预先分配的内存空间

s.resize(n)或s.resize(n,c):调整s的字符数为n。对于前者,若n<s.size(),则多的元素被抛弃;若n>s.size(),则对添加的字符进行值初始化。对于后者,调整s为n个字符,多的字符为c。

s.empty():返回的是一个bool值,string对象为空返回true,否则返回false。

注:size()返回值类型是string::size_type这样一个无符号类型整数。一条表达式中有size()就不要使用int,这样可以避免int与unsigned混淆带来的后果。


测试代码如下:

void test2()
{
 string s1 = "123456";
 //s1.reserve(8);
 cout << "size:" << s1.size() << endl;
 cout << "length:" << s1.length() << endl;
 cout << "max_size:" << s1.max_size() << endl;
 cout << "capacity:" << s1.capacity() << endl;
 cout << "Is s1 empty?" << (s1.empty() == true ? "yes" : "no") << endl;
 s1.resize(10,'c');//s1变为123456cccc
 cout << s1 << endl;
}

测试结果如下:
在这里插入图片描述

三、string对象的操作

s.clear():清空s中的所有字符。函数返回void。

s.pop_back():删除s的末尾字符。如s为空,则函数行为未定义。函数返回void。

s.push_back(t):在字符串s的尾部创建一个值为t的元素。函数返回void。

s.erase§:这里的p表示指向容器某个元素的迭代器。删除迭代器p所指定的元素,返回迭代器p之后元素的迭代器。若p指向尾元素,则返回尾后迭代器。若p指向尾后迭代器,则函数未定义。

s.erase(b,e):删除迭代器b和e所指定范围内的元素。[b,e),返回迭代器e,因为e不删除。若e是尾后迭代器,则函数返回尾后迭代器。

s.substr(pos,n):返回一个string,包含s中从pos开始的n个字符的拷贝。pos的默认值为0,n的默认值为s.size()-pos,即拷贝从pos开始的所有字符。
在这里插入图片描述
在这里插入图片描述
测试代码:

void test3()
{
 string s = "hello world!";
 s.pop_back();//删除尾元素!
 cout << "After pop_back of s:" << s << endl;
 s.push_back(',');//添加尾元素,
 cout << "After push_back of s:" << s << endl;
 s.insert(6, "cha ru ");//' '后插入" cha ru"
 cout << "After insert of s:" << s << endl;
 s.erase(5, 7);//删除"cha ru "
 cout << "After erase of s:" << s << endl;
 s.assign("xiaonengNB");//将s替换为"xiaonengNB"
 cout << "After assign of s:" << s << endl;
 s.append("hhhh");
 cout << "After append of s:" << s << endl;
 s.insert(0, "55555");
 cout << "After insert of s:" << s << endl;
 s.replace(s.begin(), s.end(), 10,'1');
 cout << "After replace pf s:" << s << endl;
}

运行结果如下:
在这里插入图片描述

四、string对象的元素访问

c.at(n):返回下标为n的字符的引用。如果下边越界,则抛出out_of_range异常。

c[n]:返回c中下标为n的字符的引用,n是一个无符号整数。若n>=c.size(),则函数行为未定义。

c.back():返回c中尾字符的引用。若c为空,函数行为未定义。

c.front():返回c中首字符的引用。若c为空,函数行为未定义。

c.data():返回指向字符串c首地址的指针。

c.c_str():返回指向字符串c首地址的const指针。

注意:返回的前4个函数返回的是字符元素的引用。若容器是一个const对象,则返回值是const引用,不可修改。若容器不是const的,则返回值是普通引用,可以修改元素的值。

测试代码如下:

void test4()
{
 string s = "hello world";
 s.at(0) = 'H';  //引用作为左值,修改首元素为H
 s[10] = 'D';  //引用作为左值,修改尾元素为D
 cout << "s:" << s << endl;
 s.front() = 'h'; //引用作为左值,还原首元素为h
 s.back() = 'd';  //引用作为左值,还原尾元素为d
 cout << "s:" << s << endl;
 const char *c = s.data();//将string对象转换为字符指针
 cout << c << endl;
 char *c1 = (char*)s.c_str();//将string对象转换为字符指针
 cout << c1 << endl;
}

测试结果如下:
在这里插入图片描述

五、string对象的查找

s.find(args):查找s中args第一次出现的位置

s.rfind(args):查找s中args最后一次出现的位置

s.find_first_of(args):在s中查找args中任何一个字符第一次出现的位置

s.find_last_of(args):在s中查找args中任何一个字符最后一次出现的位置

s.find_first_not_of(args):在s中查找第一个不在args中的字符

s.find_last_not_of(args):在s中查找最后一个不在args中的字符
在这里插入图片描述

注:
每个搜索函数的返回值类型都是string::size_type,表示匹配发生位置的下标。
若搜索失败,则返回一个名为string::npos的static成员,npos的类型为const string::size_type,初始值为-1。

测试代码如下:

void test5()
{
 string name("AnnaBelle");
 cout <<"n第一次出现的下标为:" <<name.find('n') << endl;
 cout << "n最后一次出现的下标为:" << name.rfind('n') << endl;
 cout << "nl中的任何一个字符在name中第一次出现的下标:" << name.find_first_of("nl")<<endl;
 cout << "nl中的任何一个字符在name中最后一次出现的下标:" << name.find_last_of("nl") << endl;
 cout << "name中第一个不在nl中的字符下标:" << name.find_first_not_of("nl") << endl;
 cout << "name中最后一个不在nl中的字符下标:" << name.find_last_not_of("nl") << endl;
}

测试结果如下:
在这里插入图片描述

六、string对象的比较

在这里插入图片描述

注:s等于、大于或小于参数指定的字符串,s.compare分别返回0、正数或负数。

也可以使用关系运算符比较两个字符串大下:operator==,operator!=,operator<,operator>,operator>=,operator<=
operator+:用于连接两个字符串

七、数值转换

在这里插入图片描述

注:string参数中第一个非空白符必须是符号(+或-)或数字。也可以是以0x或0X开头的16进制数。对于字符串转换为浮点数的函数,string参数也可以以小数点(.)开头,并可以包含e或E来表示指数部分。

若string不能转换为一个数值,则这个函数会抛出invalid_argument的异常。若转换得到的数值无法用任何类型来表示,则抛出out_of_range异常。


如有异议可参考:https://zh.cppreference.com/w/cpp/string/basic_string
或者自行查看《C++ primer 5th》或与本人讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值