C++STL(一)——string类

news2025/2/4 16:33:47

目录

  • 一、string的定义方式
  • 二、 string类对象的容量操作
  • 三、string类对象的访问及遍历操作
  • 四、string类对象的修改操作
  • 五、string类非成员函数


一、string的定义方式

string是个管理字符数组的类,其实就是字符数组的顺序表。
它的接口也是非常多的。本章介绍一些常见使用如文档
string类实现了多个构造函数的重载,常用的构造函数如下

 ```
default (1)			string();	//无参构造

copy (2)			string (const string& str); 	//拷贝str所指的字符序列

substring (3)		string(const char* string& str, size_t pos,size_t len =npos);	//拷贝str字符串的第pos到最后一个字符

from c-string (4)	string (const char* s);	//用C-string来构造string类对象,有'\0'

					string(const string& s);	 	//拷贝构造

from sequence (5)	string (const char* s, size_t n);	//拷贝s字符串的前n个进行初始化

fill (6)			string (size_t n, char c);	//string类对象中包含n个字符c
 ```

使用示例

//常用
string s1;								//无参构造
string s2("羚羊");						//带参构造
string s3("this is a little sheep");	//带参构造
string s4(s2);							//拷贝构造
	
//了解
string s5(7, '#');				//生成7个'#'字符的字符串
string s6(s3, 0, 3);			//从s3字符串第0下标拷贝3个字符
string s7(s3, 9);				//从s3字符串第8下标拷贝到结尾

二、 string类对象的容量操作

函数名称功能
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
max_capacity返回最大空间
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间**
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充
int main()
{
	string s1("hello world");

	//在string类里等价,常用size
	cout << s1.size() << endl;
	cout << s1.length() << endl;
	

	//根据编译器的不同结果也不同
	cout << s1.max_size() << endl;		
	cout << s1.capacity() << endl;


	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.clear();
	cout << s1.size() << endl;			//只清理字符数据
	cout << s1.capacity() << endl;		//不清理空间



	string s2("hello c++");

	//开空间,知道一共需要多少空间一次性开好空间后续就不需要扩容了
	//缩容是重新拷贝一块空间把数据拷贝进去,释放掉原空间
	s2.reserve(100);
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;

	//开空间+初始化默认\0
	s2.resize(100, 'x');		//也可选定初始化字符
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;

	s2.resize(20);		//如果只要前20个,把后面数据清掉
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;

	//empty是string的判空函数,我们可以调用strcmp函数来实现,strcmp函数是用于比较两个字符串大小的函数,当两个字符串相等时返回0。
	bool empty()
	{
		return strcmp(_str, "") == 0;
	}
	return 0}

三、string类对象的访问及遍历操作

迭代器在任何容器中都是相通的,虽然各个容器结构不一样,但在用法上都是通用的。
iterator是像指针一样的类型,iterator提供了一种统一的方式访问和修改容器的数据,算法就可以通过迭代器去处理容器中数据。

//正向迭代器
iterator 
const iterator
//反向迭代器
reverse_iterator
const_reverse_iterator
函数名称功能
operator[] (重点)返回pos位置的字符,const string类对象调用
begin+ endbegin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendrbegin获取最后一个有效字 符的迭代器 + rend获取第一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
#include<iostream>
#include<string>
using namespace std;

int main()
{
	//[]运算符重载(可读可写)
	//[ ]运算符的重载是为了让string对象能像C字符串一样,通过[ ] +下标的方式获取字符串对应位置的字符
	char& operator[](size_t i)			//只读const char& operator[](size_t i)const
	{
		assert(i < _size); 	 //检测下标的合法性
		return _str[i];		 //返回对应字符
	}

	string s;
	string s1("hello world");
	cout << s1 << endl;			//普通直接打印


	//1. 下标+[]遍历,可对字符之间做控制和修改
	for (int i = 0; i < s1.size(); i++)
	{
		s1[5] = '-';		//下标5的位置改为-
		cout << s1[i] << ' ';
	}
	cout << endl;


	//2.迭代器
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it++ << ' ';
	}
	cout << endl;


	//3.范围for,其实底层就是迭代器
	for (auto ch : s1)
	{
		cout << ch << ' ';
	}
	cout << endl;
	
	//逆置数组
	string s2("hello world");

	//写法等价
	auto rit = s2.rbegin();			//auto可自动识别类型
	string::reverse_iterator rit = s2.rbegin();
	
	while (rit != s2.rend())
	{
		cout << *rit++ << " ";
	}
	return 0;
}

四、string类对象的修改操作

函数名称功能
push_back在字符串后尾插字符c
insert插入字符或字符串
append在字符串后追加一个字符串
assign覆盖写入字符串
erase删除字符
operator=重载后该运算符支持string类的赋值、字符串的赋值以及字符的赋值
operator+= (重点)在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

+=运算符的重载是为了实现字符串与字符、字符串与字符串之间能够直接使用+=运算符进行尾插。
+=运算符实现字符串与字符之间的尾插直接调用push_back函数即可。
1、使用push_back进行尾插

int main()
{
	string s1("hello");
	s1.push_back(' ');		//插入字符
	s1.push_back('c');
	s1.push_back('p');
	s1.push_back('p');
	cout << s1 << endl;		//hello cpp
	return 0;
}

2、使用insert、append、assign插入

int main()
{
	string s1("hello world");
	
	//追加
	s1.append("abcde");
	cout << s1 << endl;		//hello worldabcde

	s1.assign("1234567");
	cout << s1 << endl;		//覆盖如上内容改为1234567


	//string& insert (size_t pos, const string& str);
	s1.insert(0, "hello");	//第0位置插入hello
	s1.insert(5, "world");	//第5位置插入world
	cout << s1 << endl;		//helloworld1234567

	
	//string& insert (size_t pos, size_t n, char c);
	s1.insert(0, 7, 'x');	//第0字符插入7个x字符
	cout << s1 << endl;		//xxxxxxxhelloworld1234567
	
	//void insert (iterator p, size_t n, char c);
	s1.insert(s1.begin()+7, 7, 'y');	//第7个位置插入7个x字符
	cout << s1 << endl;		//xxxxxxxyyyyyyyhelloworld1234567
}

3.使用erase删除

int main()
{
	string s1("hello world");
	s1.erase(5, 1);			//下标第5个位置删除一个字符
	cout << s1 << endl;

	s1.erase(5);			//下标5之后都删除



	string s2("hello world");
	
	//两个写法头删
	s2.erase(0, 1);
	s2.erase(s2.begin());
}

4.截取网站每个部分

int main()
{
	string url = "https://cplusplus.com/reference/string/string/?kw=string";
	size_t pos1 = url.find("://");
	string protocaol;
	if (pos1 != string::npos)
	{
		protocaol = url.substr(0, pos1);
	}
	cout << protocaol << endl;
	
	string domain;
	string uri;
	size_t pos2 = url.find('/',pos1+3);
	if (pos2 != string::npos)
	{
		domain = url.substr(pos1 + 3, pos2 - (pos1 + 3));
		uri = url.substr(pos2 + 1);
	}
	cout << domain << endl;
	cout << uri << endl;
}

5.+和+=

int main()
{
	string s1;
	string s2("hello");

	//支持string类的赋值
	s1 = s2;
	cout << s1 << endl; //hello

	//支持字符串的赋值
	s1 = "world";
	cout << s1 << endl;  //world

	//支持字符的赋值
	s1 = 'x';
	cout << s1 << endl; //x


	string s3;
	string s4("hello");

	//支持string类的复合赋值
	s3 += s4;
	cout << s1 << endl; //hello

	//支持字符串的复合赋值
	s3 += " world";
	cout << s3 << endl; //hello world

	//支持字符的复合赋值
	s3 += '!';
	cout << s4 << endl; //hello world!
	return 0;
}

五、string类非成员函数

operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

1.string类中也对>>和<<运算符进行了重载,这就是为什么我们可以直接使用>>和<<对string类进行输入和输出的原因。

istream& operator>> (istream& is, string& str);
ostream& operator<< (ostream& os, const string& str);
int main()
{
	string s;
	cin >> s; //输入
	cout << s << endl; //输出
	return 0;
}

2.string类中还对一系列关系运算符进行了重载,它们分别是==、!=、<、<=、>、>=。重载后的关系运算符支持string类和string类之间的关系比较、string类和字符串之间的关系比较、字符串和string类之间的关系比较。

int main()
{
	string s1("abcd");
	string s2("abde");
	cout << (s1 > s2) << endl; //0
	cout << (s1 < s2) << endl; //1
	cout << (s1 == s2) << endl; //0
	return 0;
}

这些重载的关系比较运算符所比较的都是对应字符的ASCII码值。

3.使用>>进行输入操作时,当>>读取到空格便会停止读取,我们将不能用>>将一串含有空格的字符串读入到string对象中。

用法1
可以用getline函数完成一串含有空格的字符串的读取操作。

istream& getline (istream& is, string& str);

getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。

int main()
{
	string s;
	getline(cin, s);	 //输入:hello world
	cout << s << endl;   //输出:hello world
	return 0;
}

用法2

istream& getline (istream& is, string& str, char delim);

getline函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。

int main()
{
	string s;
	getline(cin, s, 'l'); //输入:hello world
	cout << s << endl;   //输出:hello wor
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2291880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习--1.KNN机器学习入门

1、机器学习概述 1.1、什么是机器学习 机器学习&#xff08;Machine Learning&#xff09;是人工智能&#xff08;Artificial Intelligence&#xff09;领域的一个子集&#xff0c;它主要关注如何让计算机系统通过经验学习&#xff08;数据&#xff09;并自动改进性能。机器学…

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的&#xff0c;是一家日本AI公司SakanaAI的论文&#xff08;我以前写过他们的不训练提升模型的能力的文章&#xff0c;感兴趣可以去翻&#xff09;它家有Lion Jones坐镇…

基于LabVIEW的Modbus-RTU设备通信失败问题分析与解决

在使用 LabVIEW 通过 Modbus-RTU 协议与工业设备进行通信时&#xff0c;可能遇到无法正常发送或接收指令的问题。常见原因包括协议参数配置错误、硬件连接问题、数据帧格式不正确等。本文以某 RGBW 控制器调光失败为例&#xff0c;提出了一种通用的排查思路&#xff0c;帮助开发…

直方图:摄影中的视觉数据指南

目录 一、直方图基础&#xff1a;揭开它的神秘面纱 二、解读直方图类型&#xff1a;亮度与色彩的密码 &#xff08;一&#xff09;亮度直方图 &#xff08;二&#xff09;RGB 直方图 三、拍摄中巧用直方图&#xff1a;优化曝光与效果 &#xff08;一&#xff09;精准判断曝…

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

2024-我的学习成长之路

因为热爱&#xff0c;无畏山海

Kamailio 不通过 dmq 实现注册复制功能

春节期间找到一篇文章&#xff0c;需要 fg 才能看到&#xff1a; https://medium.com/tumalevich/kamailio-registration-replication-without-dmq-65e225f9a8a7 kamailio1 192.168.56.115 kamailio2 192.168.56.116 kamailio3 192.168.56.117 route[HANDLE_REPLICATION] {i…

大模型系列21-AI聊天机器人

聊天机器人 背景机器学习基础监督学习&#xff08;Supervised Learning&#xff09;概念应用场景主要问题 无监督学习&#xff08;Unsupervised Learning&#xff09;概念常见方法应用场景 强化学习&#xff08;Reinforcement Learning&#xff09;概念关键要素应用场景 模型优…

25.2.3 【洛谷】作为栈的复习不错(学习记录)

今天学习的东西不算多&#xff0c;放了一个星期假&#xff0c;感觉不少东西都没那么清楚&#xff0c;得复习一下才行。今天搞个栈题写&#xff0c;把栈复习一下&#xff0c;明天进入正轨&#xff0c;边复习边学习新东西&#xff0c;应该会有二叉树的学习等等... 【洛谷】P1449 …

Android开发工作经历整理

一.无人机应用软件开发 集成大疆官网的DJIMobileSDK到AS中编写软件&#xff0c;操控无人机执行多个航点任务。集成OpenCV库进行图像识别&#xff0c;通过获取参数&#xff0c;根据算法执行sdk&#xff0c;使无人机降落到机库&#xff0c;并执行后续的换电操作。待无人机就绪后…

C++中常用的十大排序方法之4——希尔排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之4——希尔排序的相…

自动驾驶---两轮自行车的自主导航

1 背景 无人驾驶汽车最早出现在DARPA的比赛中&#xff0c;从那个时刻开始&#xff0c;逐渐引起全球学者的注意&#xff0c;于是从上个世纪开始各大高校院所开始了无人汽车的研发。直到这两年&#xff0c;无人驾驶汽车才开始走进寻常百姓家&#xff0c;虽然目前市面上的乘用车还…

四、GPIO中断实现按键功能

4.1 GPIO简介 输入输出&#xff08;I/O&#xff09;是一个非常重要的概念。I/O泛指所有类型的输入输出端口&#xff0c;包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO&#xff08;General-Purpose Input/Output&#xff09;则是一个常见的术语&#xff0c…

PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践

title: PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践 date: 2025/1/28 updated: 2025/1/28 author: cmdragon excerpt: 在数据库管理中,备份与恢复是确保数据安全和业务连续性的关键措施。PostgreSQL 提供了一系列工具,以便于数据库管理员对数据进行…

自主Shell命令行解释器

什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令&#xff0c;都是在命令行上输入的&#xff0c;我们之前对于命令行的理解&#xff1a; 命令行是干啥的&#xff1f;是为我们做命令行解释的。 命令行这个东西实际上是我们…

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑&#xff0c;实现的是不同的优化算法的&#xff08;不同CCL库最大的区别就是这&#xff09; 不同CCL库还会根据自己的硬件、系统&#xff0c;在底层上面对一些相对应的改动&#xff1b; 但是对上的API接口…

【Redis】安装配置Redis超详细教程 / Linux版

Linux安装配置Redis超详细教程 安装redis依赖安装redis启动redis停止redisredis.conf常见配置设置redis为后台启动修改redis监听地址设置工作目录修改密码监听的端口号数据库数量设置redis最大内存设置日志文件设置redis开机自动启动 学习视频&#xff1a;黑马程序员Redis入门到…

【大数据技术】教程05:本机DataGrip远程连接虚拟机MySQL/Hive

本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…

springboot 启动原理

目标&#xff1a; SpringBootApplication注解认识了解SpringBoot的启动流程 了解SpringFactoriesLoader对META-INF/spring.factories的反射加载认识AutoConfigurationImportSelector这个ImportSelector starter的认识和使用 目录 SpringBoot 启动原理SpringBootApplication 注…