我们以前处理字符串都是用char*,而当学了string之后,我们会果断使用这个来处理字符串,因为这个是真的很简便啦!
目录
string类的优点:
不用担心内存是否够用(即字符串的长度)
不用考虑字符串结尾的空白符(即'\0')
它可以很灵活的处理字符串操作,也可以作为C++的数据类型。
基础篇:
声明一个string字符串(代码演示):
//生成一个空字符串
string str; //生成一个空字符串str
//为字符串赋初值
string str="1234567";
或string str("1234567");
//用C语言里的字符串s作为str的初值
string str(const char*s);
//生成一个字符串,包含n个字符c
string str(size_type n,char c); //假如 n=3,就相当于 str="ccc"
//复制构造函数(const的作用是防止成员函数str改变str2的值)
string str(const string &str2); //将str2赋值给str,即str=str2
成员函数(字符串的容量):
//获取字符串的字符数
size();//等同于length
//获取可以处理的最大字符数
max_size(); //无论它是空字符串还是不是空字符串,最大字符数都是一样的
可以看到这个数很大,也就是说对象str真的可以处理这么多个字符,但是你的电脑未必有这么大的内存可以给它保存这么多个字符,所以这只是一个理论值。
//获取字符串对象目前的容量
capacity(); //单位是字符
可以看到size的值变了,但是容量没有变。
原因:字符串的容量实际上就是字符串对象内部的数组的大小,而字符串对象修改字符串是需要时间给CPU运算的,每次都重新创建数组然后再修改的话,是非常低效率的,成员函数size()的作用就是获取字符的数量,而成员函数capacity()的作用就是让使用者知道,你的字符串对象的容量是这么多,在这个大小的容量范围内处理字符串是很快的,但是如果超过了这个容量的话,就需要重新创建一个更大容量的数组,并且大部分情况下,还要把旧数组中的数据复制到新数组中去,由于要复制数据,所以在字符串对象内部扩充容量的时候,CPU会有额外的运算,会额外消耗一点时间。所以简单点说,就是这个容量一旦分配好,是不会轻易改变的,所以也尽量不要超过这个容量。
//判断字符串是否为空
empty(); //其功能就是如果没有字符就返回1,有字符就返回0
//清空字符串对象
clear(); //这里有两种清空方法
可以看到两个字符串都被清空了。
//调整字符串对象的大小
resize(大小);
resize(大小,字符); //对于这种情况 string str3="12345";
str2.resize(10);//多出来的5个字符用字符类型的默认值(由于其内部是用char来保存字符的,所以字符类型的默认值就是char(),也就是数值0,对应的字符就是空字符)来填充
成员函数(操作字符串中的元素):
//操作字符串中指定位置的字符
at(位置); //相当于[]
但是用at访问和用[]访问还是有区别的。
区别:是否可以检测越界
可以看到:它没有东西输出并且正常的结束了,使用中括号是跟数组是一样的,它们都不检测是否越界
可以看到:程序崩溃了,因为成员函数at()可以检测是否越界,在越界的时候抛出异常错误,让程序直接崩溃结束掉,及时制止了错误蔓延出去,这样可以防止出现更严重的问题。
具体什么时候用哪个:因为成员函数at()多了一步检测是否越界的操作,所以它的执行速度会比中括号慢一些,当你写代码的时候已经判断过是否越界,例如不修改字符串从第一个字符到最后一个字符循环访问,这个就使用中括号,如果你不确定操作的位置是否越界,那么就用at(),但是这种情况不多,一般像这种不确定的操作,在操作之前都是先用size()判断一下,再使用中括号来访问元素,所以使用成员函数at()的情况很少。
重点篇:
//字符串的连接(三种方法)
string &append(const char *s);
string &append(int n,char c);
string &append(const string &s);
//字符串的比较(两种方法)
int compare(const string &s) const;
int compare(const char *s) const;
//字符串的查找(三种方法)
int find(char c,int pos=0) const;
int find(const char *s,int pos=0) const;
int find(const string &s,int pos=0) const;
//其中的pos为从这个位置(在这里是下标为0的位置,即第1个字符的位置)开始往后查找
//字符串的替换(三种方法)
string &replace(int p0,int n0,const char *s);//
string &replace(int p0,int n0,int n,char c);
string &replace(int p0,int n0,const string &s);
//p0表示从该位置(p0只是下标)开始删除n0个字符,然后将字符串替换到这个位置
//字符串的插入(两种方法)
string &insert(int p0,const char *s);
string &insert(int p0,const string &s);
//在p0(p0只是下标)的位置,插入字符串
//字符串的删除
string &erase(int pos=0,int n=npos);
//从pos位置(pos只是下标,在这里是从第1个位置开始)开始删除n个字符
那个,代码上的那个“第一种“是忘删了哈,可别被这小错误给干扰了。
//提取子串
string substr(int pos=0,int n=npos) const;
//即从pos位置(pos只是下标,在这里是从第1个位置开始)位置开始提取出来n个字符