1、什么是string类
C++有一个std(标准模板库),里面有各种东西,目前可以简单理解为一个类似stdio.h的头文件,随着大家对C++的不断深入了解,对std也会有更深层次的了解。string就是一个容器,而容器就是各种数据结构。
上面就是c++的string功能手册,里面有非常详细的讲解。
string本质就是一个对象,里面有字符串数组,以及系统实现的各种各样的接口功能,比如字符串的有效长度,数组指针所指向空间大小的容量,扩容功能、尾插功能、遍历等等。
注意:
1、string默认包含一个‘\0’作为字符串的结束标志,也就是说容量肯定至少是要比有效元素数量大1。
2、string是在std中实现的,所以想要使用string类,必须使用std命名空间,或者展开std命名空间。
2、string的常见接口
2.1 string对象的常见构造
string() | 构造一个空的string类 |
string (const string& str); | 用string的拷贝构造 |
string (const char* s); | 用字符串构造一个string类 |
//分别展示三种构造方法
string s1;
string s2(s1);
string s3="hello world";
2.2 string类对象的容量操作
string容量接口 | |
---|---|
size | 返回string字符串的有效容量 |
length | 效果同size |
capacity | 返回string的容量 |
clear | 清除字符 |
reserve | 预留空间 |
resize | 预留空间,但允许给特定值 |
empty | string判空 |
string s1="abcdef"; //用abcdef构造s1
cout<<s1.size()<<endl; //返回有效大小,6
cout<<s1.length()<<endl; //返回有效长度,6
//size跟length功能几乎是一样的,只是size名字更适合后续的二叉树等结构
cout<<s1.empty()<<endl; //输出1,是空就返回1非空就返回0
s1.clear(); //把字符串清除
s1.reserve(100); //把string扩容到100个字节
s1.resize(100,'a'); //把string扩容到100个字节,并且扩容出来的空间存放字符a,如果不给初始化默认是字符0。
//并且resize跟reserve有一个不同的点就是如果所给的扩容量少于string原有的字符量,reserve不做操作,resize则只保留n个(假设所传数量为n)
clear();只是清除有效元素,并不会改变string的容量大小。
注意:
上述各种接口都是string类的成员函数,并且都是无参除了resize跟reserve两个扩容接口。
2.3 string的遍历操作
关键字:iterator- -迭代器
iterator it=s1.begin();
while(it<s1.end())
{
cout<<*it<<" ";
}
cout<<endl;
迭代器访问模式,你目前可以把迭代器理解为一个指针。begin()给了首元素地址,然后end()给了尾元素地址,最后实现遍历访问。
//范围for遍历
for(auto e:s1)
{
cout<<e<<" ";
}
cout<<endl;
范围for的底层逻辑就是迭代器,迭代器实现了范围for就实现了。
2.4 string类对象的修改操作
push_back | 尾插 |
+= | 本质就是push_back |
append | 追加,本质上还是push_back |
后面两个你可以理解为实现了push_back,然后就不同的复用。
可以看到公有成员函数,紧紧支持尾插字符。
+=操作符重载,不可谓不强大,用的非常方便,常用的字符、字符串、string对象都支持。
相信大家看英文文档的水平都不差,这里也就不过多解释了,最后呼吁一句,学习计算机的宝宝一定要把数学跟英语跟物理学好呀。
append功能更加齐全,齐全到你只想使用+= (哈哈哈)
第二个append的功能说白了就是给你一个string类,从subpos下标开始追加,sublen个字符的长度
第六个就是迭代器,从【first,last)这个区间的字符串都进行追加
感受:
功能很齐全,但实际用的不多,+=那三个功能就是最为常用的,推荐大家疯狂使用。
c_str | 返回c风格的字符串,就是返回一个char* |
find | string中的查找 |
1、给你一个string类,从下标0开始找,找到就返回一个下标(size_t 无符号整型)
2、给你一个字符串,从 下标0开始找,找到就返回一个下标(size_t 无符号整型)
3、给你一个字符串,从 下标pos开始找,共查找n个字符,找到就返回一个下标(size_t 无符号整型)
4、给你一个字符,从下标0开始找,找到就返回一个下标(size_t 无符号整型)
如果没有找到,那就返回npos(无符号整型的最大值)
1 2 4这三个从0开始找都是缺省参数,如果你不给那就默认从0开始找,当然你可以从指定位置开始查找。
operator<< | 流插入运算符重载 |
operator>> | 流提取运算符重载 |
这两个操作符重载就意味着你可以
string s1;
cin>>s1;
cout<<s1<<endl;
总结:
string本质上就相当于c语言的字符数组,不过它提供了各种便捷的操作。最后我将模拟实现string类
链接: