一,认识string类<string> + std
1. string是表示字符串的字符串类
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
比特科技
3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
string;
4. 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include<string>头文件(有时不需要)以及using namespace std;
二,string类常用的接口
1.构造
函数名称 | 功能说明 |
string() | 构造空的string类对象 |
string(const string& s) | 拷贝构造 |
string(const char* s) | 提供一个c语言的字符串进行构造 |
string(size_n,char ch) | string类对象中包含n个字符串ch |
2.迭代器
本质:指针——使用:和指针使用类似的方式使用
正向迭代器begin()|end() 反向迭代器rbegin()|rend()
3.容量
函数名字 | 功能说明 |
size | 返回字符串有效长度 |
length | 返回字符串有效长度 |
capacity | 返回空间总大小 |
empty | 检测字符串释放为空串,是返回true,否则返回false |
clear | 清空有效字符 |
reserve | 为字符串预留空间**(缩小不会改变) |
resize | 将有效字符的个数该成n个,多出的空间用字符c填充 |
reserve:扩容,不会改变有效元素的个数
reserve(size_t newcapacity)
假设当前扩容的string对象底层容量oldcapacity
newcapacity>oldcapacity:reserve方法才会真正扩容
newcapacity<oldcapacity
newcapacity>=16:reserve不会将空间缩小
newcapacity<=15:reserve才会将空间缩小
PJ版本中的STL 的string:内部维护了一个固定大小的数组——16
如果构造了string对象时,字符串长度小于等于15个字节,直接放到string对象内部的数组中,不需要从堆上申请空间——效率高:因为80%的字符串长度小于15字节
如果字符串长度大于15个字节,string对象在构造时从堆上申请空间
4.元素访问
T&operator[](size_t index) | const T&operator[](size_t index)const-----assert异常
T&at[](size_t index) | const T&at[](size_t index)const-----out_of_range异常
5.修改
void push_back(char ch)
6.特殊操作
size_t find(char ch,size_t pos = 0);
size_t find(const string&s,size_t pos = 0);
从前往后找第一个s出现的位置,找到之后返回s首字母在字符串中的位置,没有找到返回的是npos——npos是string类内部维护的一个静态成员变量
rfind(从后往前找)
三,string类模拟实现
1.写时拷贝