C语言中实际没有专门的字符串类型,如果要表示字符串:char* 或者字符数组(\0)。C语言还提供了一个专门用来进行字符串操作的库函数(<string.h>)。C++标准库提供string类类型,支持C里面的所有操作,另外还增加了其它更多的功能。
string的常用接口
1、常见构造:
string(); //构造一个空字符串,以\0结尾
string(size_t n, char ch); //用n个字符串ch构造一个string类型的对象
string(char* str); //用C格式的字符串构造string对象
string(const string& s); //拷贝构造
string类中的迭代器一般不会使用,常见的遍历方式(for+下标 || 范围for)
2、容量操作
size_t size() / length(); //返回字符串有效字符长度
size_t capacity(); //返回底层空间总的大小
bool empty(); //检测该字符串是否为空字符串;是:true、否:false
clear(); //清空有效字符
void reserve(); //为字符串预留空间
void resize(size_t newsize, char ch = char()); //将有效字符的个数改为newsize个,
3、resize() 和 reserve() 详解
resize(size_t newsize, char ch = char());
含义:将string中有效元素修改到newsize个
假设:当前string对象中有效元素个数为oldsize个,容量为capacity个
newsize <= oldsize:resize()会将元素个数缩减到newsize个;
newsize > oldsize:resize()需要将有效元素个数增加到newsize个。
- newsize <= capacity:不需要扩容,直接使用ch来填充;
- newsize > capacity:需要扩容(申请新空间、拷贝元素、释放就空间、在新空间中填充ch)
void reserve(size_t newcapacity); //用来进行扩容的
注意:reserve()只是进行扩容,并不会改变有效元素个数
假设:当前对象底层空间大小为oldcapacity
- newcapacity <= oldcapacity:忽略该操作
- newcapacity > oldcapacity:才会真正进行扩容---->申请新空间、拷贝元素、释放就空间
4、元素访问
都是获取string类型对象中index下标位置上的字符
// 下标越界:assert
char& operator[](size_t index);
const char& operator[](size_t index)const;
// 下标越界:抛异常(out_of_range)
char& at(size_t index);
const char& at(size_t index)const;
5、修改
operator+=(const string& s); //在字符串后追加字符串s
push_back(ch); //在字符串后尾插字符ch
append(char/char*/string); //在字符串后追加一个字符串
6、特殊操作
const char* c_str(); //可以将string内部空间的首地址返回
find(ch/char*, pos = 0); //正向查找
rfind(ch/char*, pos = string::npos); //反向查找,默认从末尾来进行查找
注意:string::npos是string内部维护的一个静态成员变量
string substr(size_t pos = 0, size_t n = string::npos); //从当前string对象的pos位置开始,截取n个长度的字符,返回该字符串
7、string的扩容机制
vs下----PJ----STL:1.5倍;
linux下----SGI----STL:2倍
8、OJ中的注意事项
需要用户自己处理数据的输入(循环输入)
- 一行只有一个字符串
string s;
while(cin >> s){
//对s进行操作
}
- 一行有多个字符串
string s1, s2;
while(cin >> s1 >> s2){
//对s1和s2进行操作
}
- 一行有多个字符串,要求:需要一次将整行字符串整体接收(一般这些字符串都是以空格分隔的)
//cin 是正在读取的输入流,而 s 是接收输入字符串的 string 变量的名称。
while(getline(cin, s)){
//对s进行操作
}