String类的接口实现
一:string的基本用法
1.:用string类实例化对象的几种方式
(1).普通的方式实例化方式
string s;
(2).调用构造函数
string s1("hello world!");
(3).指定长度,并进行初始化
string s2(10,'$');
string 对象名(n,‘x’);其中n表示需要开辟的空间,x表示申请空间中填充的内容
(4).调用拷贝构造的方式实例化对象
string s(s1);
2:求字符串长度的方式
- 对象.size()的方式
- 对.length的方式
s.size();
s.length();
//计算并输出s字符串的有效字符个数
(2):字符串容量的求法
方式:对象 . capacity
s.capacity();
其中对象扩容的时候,当容量比较小的时候按接近2倍的大小扩容
当所需容量比较大的时候就按1.5倍的大小进行扩容
三:string类的其他用法
cout << s1.empty() << endl;
//判断字符串是否为空,结果为布尔值(1/0)
string s4("hellow bit!");
cout << s4[0] << endl;
//s4[n]输出s4的第n个字符
s4[0] = 'H';
//s[n]='x' 改写字符串的第n个字符,如果n大于其容量就会抛异常
//触发了assert检查
二:string类特殊用法
1.改变字符串容量的大小
s.resize(10);
调用形式: s.resize(size_t n);
resize函数将大小更改为第一个参数指定的长度改变指定字符串的空间
在增大空间的时候其地址可能改变
在减小空间大小的时候地址不会改变
s.reszie(10,'&');
调用格式:s.resize(size_t n,char ‘x’);
将字符串s的大小改为10,并将其值置为字符 'x’
s.resize(20, '5');
对s进行了扩容,并将多处的空间初始化为’5’(既字符串s的前10个字符的值任然为指定的字符 ‘&’),该接口只是将改变后多出的值置为字符’5’
调用格式: s.size(size_t n,char ‘c’)
【小结】
此处的n有第三种情况
1.n<size size变成n,capacity大小不变
2.size<n<capacity size变成n,capacity不变
3.n>capacity size变成n,capacity增大,[size~n]这个范围中的值被置成’c’
【注】:此处的size值字符串的有效长度,capacity只的是字符串编辑器实际分配的容量大小
s.size(10);
调用格式:s.size(size_t n)
【小结】
1.n<size size变成n,capacity大小不变
2.size<n<capacity size变成n,capacity不变,[size,capacity]这个范围中的值被置成’\0’
3.n>capacity size变成n,capacity增大,[size,n],这个范围中的值被置成’\0’
cout << s.c_str() << endl;
//c语言的方法,按c 的格式获取.输出的是字符串的内容
cout << hex << (int)s.c_str() << endl;
//输出字符串的首地址(以16进制的方式输出)
给字符串s的预留空间
s.reserve(20);
s.reserve(5);
给s预留空间,不会改变有效元素个数(不会改变原来字符串的内容)
调用格式void reserve(size_t n=0):
提高效率,减少工作时间
【小结】
reserve用来增容,提高效率,减少增容操作
当n<capacity时,不会对字符串做任何改变
当n>capacity时,进行增容,不改变size的大小
NO2:改变字符串的内容
s += " haha";
s += '!';
string s1("hehe!");
s += s1;
通过这种方式可以将字符串的内容进行扩展,既会改变字符串的有效字符串长度,当所加内容与原字符串的有效长度之和大于源字符串的容量,还会对字符串进行扩容
NO3:添加字符串
s += 'w';
//添加字符
s.append("ang");
s += " shi xian";
//添加字符串
接口append此处用来往指定字符串中添加内容
string s="hello world!"
string s1;
s1.assign(s);
cout << s1 << endl;
//复制了s的内容,打印出的内容和s的一样
s1.assign(s,0,3);
//在s中从第0个位置拿上3个字符给s1;
cout << s1 << endl;
s1.assign(10,'a');
//s.assign(size_t n,'x');将s1中的内容改成n个'x'
cout << s1 << endl;
s1.assign(s.begin(), s.end());
//拷贝整个字符串s
NO4:插入接口
string s;
s.insert(0, "hello");
cout << s << endl;
s.insert(0, "bit!");
cout << s << endl;
调用方式:s.insert(size_t pos,const string& str)
从字符串位置为0的位置开始头插指定的内容
string s="hello world!";
string s1;
s1.insert(0,s,3,5);
往s1中插入s中第0个位置开始数第3元素往后的5个元素
NO5:删除(erase)
string s("hello bit!");
s.erase(0,4);
//删除从第0个位置开始的4个字符
cout << s << endl;
调用方式: string& erase(size_t pos,size_t len);
删除指定位置下标pos开始len个字符
【小结】
如果输入的length大于字符串长度,取实际长度和length的大小中的 较小者(既将所有的字符删除掉)
NO6:代替(replace)
string s("hello bit");
string s1("haha");
s.replace(0, 2, s1);
//用s1中的 内容来代替s中从位置0开始的2个字符
NO7:拷贝另一个字符串中指定的内容
string s1 = s.substr(2,8);
//s1拷贝字符串s中从位置2到位置8的内容
调用方式:substr(size_t pos=0,size_t n);
拷贝从字符串s中的位置0开始的n个字符
NO8:查找
size_t pos = s.find('o');
从字符串s中从头开始查找指定字符第一次出现的位置
size_t pos =s.rfind('o');
rfind()从指定字符串的尾端开是查找第一个’o’出现的位置
string add = "http://www.cplusplus.com/reference/string/string/";
size_t pos1 = add.find("://");
输出的是字符串中第一个字符的位置
size_t sz = add.find('/',pos1 + 3);
调用方式: find(char ‘x’,size_t pos);
从指定的位置下标pos开始查找指定的字符’x’