当前位置: 首页 > article >正文

string类的使用(上)

目录

1.string类的概念

2.string的构造函数(实现初始化)

3.对string类容量获取和操作

4.string类对象的访问和遍历

4.1operator[]

4.2begin和end

4.3 rbegin 和 rend 

4.4迭代器分类

4.5范围for(自动实现++遍历)

5.string类对对象的修改和查找

5.1operator+=

5.2c_str

5.3npos和find 

 5.4 rfind

5.5substr

5.6 insert和erase

6.其他函数:

6.1operator+

6.2getline

6.3relational operator


1.string类的概念

上面是c++官方对string类的描述,我们不难发现string类的底层其实是:basic_string模版以char类型实例化出的结果。它实际上是以可动态增长的数组提供存储,并提供许多接口,实现多字符串的多种操作。 

2.string的构造函数(实现初始化)

string类提供了多种构造函数。但我们在实际中多用到的是 默认构造函数,拷贝构造函数,以字符串构造函数。 

string st1;//默认构造(重要
string st2("abcd");//带参构造(重要
string st3(st2);//拷贝构造(重要
string st4(st2, 2, 2);//子字符串构造(了解
string st5(st2, 3);//顺序构造(了解
string st6(4, 48);//填充构造(了解
string st7(st2.begin(), st2.begin() + 3);//范围构造(了解

3.对string类容量获取和操作

其中的size和length是同样的效果,capacity是返回空间容量, empty是判空.

clear是清空字符串(但是capacity不会变,只是size = 0)

reserve是申请改变容量(只有当n>capacity时,才会申请成功),当n<=capacity时都没有变化

resize:将字符串大小调整为 n 个字符的长度。如果 n 小于当前字符串长度,则当前值将缩短为其前 n 个字符,并删除第 n个字符以外的字符。如果 n 大于当前字符串长度,则通过在末尾插入所需数量的字符来扩展当前内容,以达到 n 的大小。如果指定了 c,则新元素将初始化为 c 的副本,否则,它们是值初始化字符(空字符)

4.string类对象的访问和遍历

4.1operator[]

string类已经完成了对[]的重载,我们用 name[pos]即可访问pos位置的字符

4.2begin和end

begin和end的返回参数需要用迭代器来接收,在string类里,迭代器(string::iterator)就像指针一样,但它不一定是指针。begin返回的首字符的指针,end返回的是末尾字符的后一个字符的指针。

我们用迭代器实现以下string的遍历

	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}

4.3 rbegin 和 rend 

rbegin rend 与begin end类似,只不过他们的指向位置不同,正向方向不同

实现反向遍历

string s1("hello claus");
string::reverse_iterator it = s1.rbegin();
while (it != s1.rend())
{
	cout << *it << " ";
	++it;
}

4.4迭代器分类

4.5范围for(自动实现++遍历)

string s1("cada");
for (auto i : s1)
{
	cout << i << " ";
}

5.string类对对象的修改和查找

5.1operator+=

operator+= 可以实现push_back(在string后加单字符)和append(是string后加字符串)的功能

5.2c_str

将string对象转换为c语言中的const char*格式,以便使用strcpy等针对字符串的函数 

我们可以在这里区分下输出字符串和string的区别:

 cout字符串的逻辑是输出到字符串的末尾\0,而cout<<string是把string类的所有输出,不管有没有\0.

5.3npos和find 

npos是属于string类中的静态变量,使用string::npos,其代表的是size_t类型的-1,也就是size_t

的正向最大值。

find(char c,size_t pos = 0)是从pos位置找字符c或者字符串s出现的位置,如果找到就返回其位置出,找不到就返回npos。 其还有许多如下用法

 5.4 rfind

rfind是从pos位置向前找字符c或者字符串s,返回位置,如果没找到就返回npos,其他用法如下

5.5substr

从string中的pos位置开始,截取n个字符,返回值

 5.6例:分离URL中的协议,域名和资源名称

void trennen_url(const string& url)
{
	size_t pos1 = url.find(':');
	if (pos1 != string::npos)
	{
		cout << url.substr(0, pos1) << endl;
	}
	size_t pos2 = pos1 + 3;
	size_t pos3 = url.find('/', pos2);
	if (pos3 != string::npos)
	{
		cout << url.substr(pos2, pos3 - pos2) << endl;
		cout << url.substr(pos3 + 1);
	}
}

5.6 insert和erase

insert是向pos位置插入某个字符串或者string,所有用法如下(如果用迭代器是只能插入单字符且是正向)

erase 是从pos位置,删除n个长度

6.其他函数:

6.1operator+

operator+和operator+=的区别是前面的不会改变string,而后面的会改变string,但是他们的输出都是相同的。

6.2getline

当输入的string有space时,用scanf或者cin只能获取一部分,因为这两种遇到space或者换行就会停止输入,而getline只有换行时停止输入。一般的用法是getline(cin,str);其中cin是输入流

6.3relational operator

string还提供了互相比较大小的方法,其与c语言中的字符串比较大小相似,不做过多描述

扩展阅读:

ascii是一种值和字符的映射关系,0-255个值映射了许多字符。ascii是1个字符为一个编码

utf8和window gbk 是值和中文的映射关系。UTF-8使用1~4字节为每个字符编码,gabk为2字节为一个字符编码


http://www.kler.cn/news/325448.html

相关文章:

  • Maven-四、继承
  • 人工智能赋能产业升级!亲笔签数字笔迹AI识别技术在第二十四届工博会上大放异彩
  • 开启争对目标检测的100类数据集-信息收集
  • [001-03-007].第28节:SpringBoot整合Redis:
  • Agilent E4438C 6G产品说明书
  • cnn机器学习时python版本不兼容报错
  • 游戏怎么录制?王者荣耀游戏录制指南:iOS与电脑端全面教程
  • JavaScript异步编程:async、await的使用
  • Bug:ThreadPoolTaskScheduler搭配CronTask完成定时任务,关闭scheduler后CronTask任务仍然执行?
  • ROS学习笔记(二):鱼香ROS — 超便捷的一键安装/配置/换源指令(Ubuntu/ROS/ROS2/IDE等)
  • android和ios双端应用性能的测试工具
  • springBoot --> 学习笔记
  • 锐捷—NAT地址映射+IPsec隧道
  • 使用openpyxl轻松操控Excel文件
  • C++学习笔记(48)
  • grafana加载缓慢解决方案
  • 初学playbook,从一个简单的示例开始。
  • Vue前端浏览器指纹获取:数字世界的身份密码
  • linux常见指令与权限【第四课】
  • C语言基本语法————基本数据类型、变量与常量
  • HDFS组件相关问题-持续更新
  • Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
  • RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!
  • 【在Linux世界中追寻伟大的One Piece】进程间通信
  • 在Windows on Arm上使用Electron构建桌面应用
  • Rust和Go谁会更胜一筹
  • Day28笔记-Python自动化操作Word
  • Redis结合Caffeine实现二级缓存:提高应用程序性能
  • 计算机组成原理之数制与编码
  • 交通标志与路面标识检测系统源码分享