string类(C++)


以下都是以初学者的角度,有些乱,但层层递进,没有依照C++标准库的顺序

一.引言

string类是C++标准库里面的一个模板
在这里插入图片描述

首先得会看文档,这里推荐两个:个人认为cpulspuls看起来比官网舒服
cpulspuls:https://cplusplus.com/reference/
C++的官网:https://en.cppreference.com/w/cpp
下面都是以cpulspuls为基准查
在这里插入图片描述
个人喜欢切到旧版直接查:
在这里插入图片描述
在这里插入图片描述

二.string类:

下面按照cpulspuls的顺序进行一步步讲解:

成员函数:

在这里插入图片描述
C++头文件基本是不带.h的

构造函数:

可以看出有7个构造函数
在这里插入图片描述
根据英文可以得出:
1.默认构造函数
2.拷贝构造
3.也是拷贝,从pos拷贝到len
在这里插入图片描述
其中npos是:无符号整形,存到里面就是整形的最大值,代表着str最后一位
在这里插入图片描述
4.可以用一个字符串来构造,其中c-string有可能是字符串也可能是个数组,核心就是最后得有一个‘\0’
这里来用一用前4个构造函数:

在这里插入图片描述在这里插入图片描述

上面的流插入其实本来也用不了的,是库中有运算符重载才可以用
在这里插入图片描述
5.拷贝字符串的前n个(并不是很常用)
6.拷贝n个字符
例子;
在这里插入图片描述

析构函数

析构函数自动调用,所以不用关注
在这里插入图片描述

遍历:

operator[]

由于string中成员变量是私有的,所以用到了C++标准库提供的size和operator[],用法就是字面意思
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s1("hello world");
	for (size_t i = 0;i<s1.size();i++)
	{
		cout << s1[i] << " ";//相当于cout << s1.operator[](i) << " ";
	}
	return 0;
}

不仅能够遍历还能够修改:

for (size_t i = 0;i<s1.size();i++)
	{
		s1[i]++;
	}

还有一点要注意:sting中有size,那么hello world中size存的是几
答案是11:因为后面的’\0’只不过是表示符,跟C语言匹配而已
在这里插入图片描述

迭代器(iterator)

iterator是一个类型,定义在类里面的
迭代器行为像指针一样的类型对象

int main()
{
	string s1("hello world");
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	return 0;
}

在这里插入图片描述

范围for

e依次取s1容器中的数据,自动迭代,自动往后走

int main()
{
	string s1("hello world");
	for (auto e : s1)
	{
		cout << e << " ";
	}
	return 0;
}

其实范围for的底层就是迭代器:从反汇编可以看出运行起来相似。
在这里插入图片描述
在这里插入图片描述

反向遍历(反向迭代器reverse_iterator)

int main()
{
	string s1("hello world");
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	return 0;
}

const迭代器

int main()
{
	const string s1("hello world");
	string::const_iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	return 0;
}

C++11认为begin不够很好的区分const和正常的,所以加了cbegin。很多人依旧用的是begin

在这里插入图片描述在这里插入图片描述

容器:

在这里插入图片描述
首先发现size和length功能一样,由于历史问题,一开始没有STL库,数据结构都是以length命名,后来STL库出来后才有的size。所有的语言只能向前兼容,所以留着length
max_size是最大的长度,没啥参考意义,每个编译器下面基本都不一样

capacity扩容

通过以下代码可以看出一次扩多少空间

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s;
	size_t sz = s.capacity();
	cout << "capacity changed: " << sz << endl;
	for (int i = 0;i<100;++i)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << endl;
		}
	}
	return 0;
}

可以看出第一次是2倍,后面都是1.5倍扩容
在这里插入图片描述
当然扩容没有明确规定扩多少,Linux的g++编译器是一次性2倍扩
在这里插入图片描述

clear清数据

就是把数据都清掉:
在这里插入图片描述
这里是清数据,空间还在:
在这里插入图片描述

shrink_to_fit缩容:

C++11增加的缩容空间
在这里插入图片描述

resever扩容

扩容是有代价的,尤其是异地扩容,resever是直接开好多少个空间,不像capacity需要循循渐进的扩容
在这里插入图片描述
这里是扩出了111个空间,更准确说是112个,有个’\0’没算,每个编译器下的扩容规则不一样,相同的代码,Linux的g++正好扩出100个
在这里插入图片描述
如果resever<size不会缩容
在这里插入图片描述
size<resever<capacity也不会缩容
在这里插入图片描述

resize改变大小:

有三种情况:
在这里插入图片描述
这里来演示一下:插入默认是’\0’

n<size在这里插入图片描述
size<n<capacity在这里插入图片描述
n < capacity在这里插入图片描述

并且有函数重载,如果不想默认插入的是’\0’,可以自己手动添加
在这里插入图片描述
例子:
在这里插入图片描述

元素访问

以下都是对元素的访问
在这里插入图片描述
operator[ ]就是运算符重载,用法如下:
在这里插入图片描述
at访问
在这里插入图片描述
用法如下:
在这里插入图片描述
operator[ ] 与at的不同之处就在于越界的检查不同
operator[ ]的越界:
在这里插入图片描述
at的越界:
在这里插入图片描述
当然也可以捕获at的越界异常
在这里插入图片描述
常用都是operator[ ]
front和back都是取字符串头和尾部的字符,出于规范提供,实践并没有什么用

修改:

修改主要是一些插入数据
在这里插入图片描述

尾部插入数据:

如果想插入某个字符可以用push_back:
在这里插入图片描述
在这里插入图片描述
apend可以插入字符串
在这里插入图片描述
以下是上述第三行用法(最常见的)
在这里插入图片描述
第五行用法
在这里插入图片描述
下述代码如果不想要s1两侧的空格可以:
在这里插入图片描述
大多数不用push_back和append,用+=,不仅可以连接单个字符,还可以连接字符串
在这里插入图片描述
在这里插入图片描述

assign覆盖值

实践中很少使用
在这里插入图片描述
第一行用法:直接对s的空间上覆盖
在这里插入图片描述

insert中间插入

在这里插入图片描述
用的最多的是第三行:跟顺序表类似,在中间插入时间复杂度就是O(n),所以尽量不用instert
在这里插入图片描述

erase删掉某个位置

在这里插入图片描述
演示上述第一行:从第三个位置开始删,删除1个
在这里插入图片描述
也是个全缺省,删空:
在这里插入图片描述

repalce替换字符字符串

用的也很少
在这里插入图片描述
下面是上述第一行:把下标为6的后面3个字符替换成%60
在这里插入图片描述
以上的insert/erase/replace能少用就少用,因为基本都要挪动数据,效率不高

字符串操作

C的字符串c_str

就比如C语言中fopen需要char*的字符串,但创建的的string类型的,可以用c_str,就是为了与C语言兼容
在这里插入图片描述
在这里插入图片描述

data

跟c_str差不多,把string转换成char*,大多数都用c_str
在这里插入图片描述

substr截取

copy很少用,基本上都是substr
在这里插入图片描述
在这里插入图片描述

find寻找字符字符串

在这里插入图片描述
找空格:不给参数是从头找
在这里插入图片描述
当然也可以找字符串。
如果没找到返回npos;
在这里插入图片描述
所以可以这么用:找到空格,然后改
在这里插入图片描述
所以上述的找空格有另一种写法:
在这里插入图片描述

rfind反着找

在这里插入图片描述
在这里插入图片描述

非成员函数重载

getline

在cin输入的时候遇到空格和’\n’就不会读取
例如:输入123 456但只有123在a1,456在缓冲区
在这里插入图片描述
C语言中用getchar解决,C++输入string解决空格问题使用getline:
在这里插入图片描述

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅碎时光807

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值