详细了解C++的string类

1、什么是string类

C++有一个std(标准模板库),里面有各种东西,目前可以简单理解为一个类似stdio.h的头文件,随着大家对C++的不断深入了解,对std也会有更深层次的了解。string就是一个容器,而容器就是各种数据结构。

https://cplusplus.com/reference/string/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预留空间,但允许给特定值
emptystring判空
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*
findstring中的查找

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类

链接:

        http://t.csdnimg.cn/Svr3Y

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值