【C++】:string类的基本使用

目录

  • 引言
  • 一,string类对象的常见构造
  • 二,string类对象的容量操作
  • 三,string类对象的访问及遍历操作
  • 四,string类对象的修改操作
  • 五,string类非成员函数
  • 六,整形与字符串的转换

引言

string 就是我们常说的"串",它是一种字符数组,只不过这个数组具备扩容,增删查改等功能。string类在我们日常生活中是十分常用的,并且在笔试,面试中也经常出现,它是学习C++的不可缺少的一部分。

string类大概有120个函数接口,注意下面只讲解最常用的接口,想要了解更多,前往https://legacy.cplusplus.com/reference/string/string/网站里浏览。

一,string类对象的常见构造

在这里插入图片描述

代码演示:

void test_string1()
{
	string s1;//无参默认构造

	string s2("hello world");//用字符串构造

	//从str中的pos下标位置,拷贝len个字符
	string s4(s2, 3, 5);
	
	//不传第三个参数,默认拷贝到结尾,缺省参数npos是整型最大值
	string s5(s2, 3);

	string s3(s2);//拷贝构造
}

二,string类对象的容量操作

在这里插入图片描述

代码演示1:

// size/clear/resize
void Test_string2()
{
	// 注意:string类对象支持直接用cin和cout进行输入和输出
	string s("hello, world!!!");
	cout << s.size() << endl;//计算字符个数,不算\0
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
	s.clear();
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
	//当传的值大于size时,此时会影响capacity+size,两个都会增加
	// “aaaaaaaaaa”
	s.resize(10, 'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
	// "aaaaaaaaaa\0\0\0\0\0"
	// 注意此时s中有效字符个数已经增加到15个
	s.resize(15);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中有效字符个数缩小到5个
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}

代码演示1:

//测试reserve
void test_string3()
{
	string s;
	
	//一般用在知道需要多少空间,提前开好
	s.reserve(100);

	string s1("111111111");
	cout << s1.capacity() << endl;//15

	//扩容
	//reserve只影响capacity,不影响size,即不改变里面的数据
	s1.reserve(100);
	cout << s1.capacity() << endl;//111

	//缩容
	//传的值比当前的capacity小时,
	// vs一般不缩容,g++会缩
	s1.reserve(10);
	cout << s1.capacity() << endl;//15
}

注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  2. clear()只是将string中有效字符清空,使size = 0,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(size_t n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

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

string类对象的访问及遍历有三种方式:
1. 迭代器:begin()+end()
2. for+[]
3. 范围for

注意:string遍历时使用最多的还是for+下标 或者 范围for(C++11后才支持)

begin()+end()大多数使用在需要使用STL提供的算法操作string时,比如:采用reverse逆置string,使用sort按字典序排序(按ASCII码值排序)。

代码演示:

void Teststring4()
{
	string s("hello Bit");
	
	// 3种遍历方式:
	// 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符,
	// 另外以下三种方式对于string而言,第一种使用最多
	
	// 1. for+operator[]
	for (size_t i = 0; i < s.size(); ++i)
		cout << s[i] << endl;

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

	// string::reverse_iterator rit = s.rbegin();
	// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
	auto rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << endl;
	}

	// 3.范围for
	//自动取出s中的数据赋给ch,自动判断结束,自动++。
	//其实底层就是迭代器。
	for (auto ch : s)
	{
		cout << ch << endl;
	}
}

使用sort按字典序排序(按ASCII码值排序):

void test_string5()
{
	string s1("hello world");
	cout << s1 << endl;

	//按字典序排序(按ASCII码值排序)
	//用排序函数sort [first last)左闭右开,last传的不是有效数据
	//sort(s1.begin(), s1.end());

	//第一个和最后一个不参与排序
	//sort(++s1.begin(), --s1.end());

	//前5个排序  [0,5)
	sort(s1.begin(), s1.begin() + 5);
	cout << s1 << endl;
}

四,string类对象的修改操作

在这里插入图片描述

  1. 插入(拼接)方式:push_back append operator+=
  2. 正向和反向查找:find() + rfind()
  3. 截取子串:substr()
  4. 删除:erase

代码演示1:

void test_string6()
{
	string s1("hello world");
	cout << s1 << endl;

	s1.push_back('x');//一个字符一个字符尾插
	cout << s1 << endl;

	s1.append(" yyyyyyy!!");//尾插一个字符串
	cout << s1 << endl;

	string s2("22222");

	//直接尾插
	s1 += 'aaa';
	s1 += 'd';
	s1 += s2;

	cout << s1 << endl;
}

代码演示2:

void test_string7()
{
    // 获取file的后缀
	string file("string.cpp");
	
	//从后往前找'.'
	size_t pos = file.rfind('.');
	string suffix(file.substr(pos, file.size() - pos));
	cout << suffix << endl;

	// npos是string里面的一个静态成员变量
	// static const size_t npos = -1;

	// 取出url中的域名
	string url("http://www.cplusplus.com/reference/string/string/find/");
	cout << url << endl;
	size_t start = url.find("://");
	
	if (start == string::npos)
	{
		cout << "invalid url" << endl;
		return;
	}
	
	start += 3;
	size_t finish = url.find('/', start);
	string address = url.substr(start, finish - start);
	cout << address << endl;

	// 删除url的协议前缀
	pos = url.find("://");
	url.erase(0, pos + 3);
	cout << url << endl;
}

注意:

  1. 在string尾部追加字符时,s.push_back( c ) / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

五,string类非成员函数

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0d01f1518e0e4654a84bd21e221afb38.png

代码演示1:

void test_string8()
{
	string s1 = "hello";
	string s2 = "world";

	string ret1 = s1 + s2;
	cout << ret1 << endl;

	string ret2 = s1 + "xxxxx";
	cout << ret2 << endl;

	string ret3 = "xxxxx" + s1;
	cout << ret3 << endl;

	//按字典序比较
	cout << (s1 < s2) << endl;
}

代码演示2:

int main()
{
	string str;

	string str2;
	//如何停止输入?
	//ctrl+c
	//ctrl+z+空格
	//	while (cin >> str2)
	//	{
	//		cout << str2 << endl;
	//	}

	//cin 遇到空格或者换行会停止提取
	//cin >> str;

	//获取一行包含空格的字符串
	getline(cin, str);

	int pos = str.rfind(' ');
	cout << str.size() - (pos + 1) << endl;

	return 0;
}

六,整形与字符串的转换

int main()
{
	int x = 0, y = 0;
	cin >> x >> y;
	
	//to_string:整形转字符串
	string str = to_string(x + y);
	cout << str << endl;
	
	//stoi:字符串转整形
	int aa = stoi(str);
	cout << aa << endl;

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

JVM学习-虚拟机栈

虚拟机栈 每个线程创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个栈帧&#xff0c;对应一次次Java方法调用&#xff0c;栈是线程私有的。 生命周期: 与线程相同 作用 主管Java程序的运行&#xff0c;它保存方法的局部变量、部分结果、并参与方法的调用和返回。 …

优思学院|六西格玛与ISO9001最大的共同点是什么?

六西格玛管理和ISO 9001的共同点是它们都将客户放在首位。每个组织都有其特定的客户群&#xff0c;并向他们提供符合或超出期望的产品。 没有客户&#xff0c;组织无法生存。 因此&#xff0c;组织必须时刻关注并理解客户的当前和未来需求&#xff0c;并据此开展一切活动&…

yolov9训练自定义数据

1.训练yolov9&#xff0c;先准备好一份自定义数据.。到roboflow下载一份数据&#xff0c;数据格式是yolo格式。 2.到github下载yolov9源码 https://github.com/WongKinYiu/yolov9 3.为了方便配置环境&#xff0c;把代码上传到矩池云上面&#xff0c;使用云服务器 4.执行 pip i…

设计非递归算法,编程:在二叉排序树中,打印关键码a, b的公共祖先。注:例,若a是b的祖先,则a不算作公共祖先。反之亦然。

二叉排序树&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;// 定义二叉树节点结构 typedef struct BTNode {char show;struct BTNode* left;struct BTNode* right; } BTNode;// 非递归插入节点的函数 BTNode* insertNode(BTNode* root, char k…

fastadmin对登录token的处理

fastadmin对token的操作 最近开发遇到一个场景&#xff0c;需要绕过验证获取登录&#xff0c;所以恶补了一下这个知识点&#xff0c;这个主要就是控制fastadmin的token的问题 代码分步实现 class Xcxuser extends Api {//关于鉴权protected $noNeedLogin [login,getopenid,…

Java:使用BigDecimal、NumberFormat和DecimalFormat保留小数

一、代码和调试结果 1.1 BigDecimal ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fa36749de8124266a730817710fdf737.png) 1.2 DecimalFormat 1.3 NumberFormat 二、原代码 BigDecimalUtil.java 代码 package utils;import java.math.BigDecimal; import jav…

【Qt】Qt开源项目

1、Flameshot 截图工具 1.1 简介 Flameshot是一款功能强大但易于使用的屏幕截图软件,中文名称火焰截图。 Flameshot 简单易用并有一个CLI版本,所以可以从命令行来进行截图。 Flameshot 是一个Linux发行版中完全免费且开源的截图工具 1.2 源码 github:https://github.com…

申请一个开发者域名

申请一个开发者域名 教程 fourm.js.org 因本地没安装 hexo 环境&#xff0c;模板下载的 html

代理IP与网络隐私

随着科技的发展&#xff0c;越来越多的人开始享受网络的便利&#xff0c;人们逐步在社交媒体上分享自己的生活。这些公开信息是可以被所有人浏览观看的&#xff0c;但是也会存在部分隐私信息我们并不想要被人知晓&#xff0c;这就牵扯到网络隐私保护问题。 代理IP对于网络隐私保…

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

Shell之高效文本处理命令

目录 一、排序命令—sort 基本语法 常用选项 二、去重命令—uniq 基本语法 常用选项 三、替换命令—tr 基本语法&#xff1a; 常用选项 四、裁剪命令—cut 基本语法&#xff1a; 常用选项 字符串分片 五、拆分命令—split 基本语法&#xff1a; 六、 文件…

【if条件、for循环、数据框连接、表达矩阵画箱线图】

编程能力&#xff0c;就是解决问题的能力&#xff0c;也是变优秀的能力 From 生物技能树 R语言基础第七节 文章目录 1.长脚本管理方式if(F){....}分成多个脚本&#xff0c;每个脚本最后保存Rdata&#xff0c;下一个脚本开头清空再加载 2.实战项目的组织方式方法&#xff08;一&…

【微服务最全详解】

文章目录 微服务微服务的介绍微服务服务架构演变 微服务网关微服务的负载均衡微服务的容灾机制服务崩溃服务容灾机制微服务熔断机制微服务限流Sentinel怎么实现限流微服务限流算法1.令牌桶算法2.漏斗桶算法 服务监控日志收集 微服务 微服务的介绍 微服务是一种软件架构风格&a…

上班族兼职新篇章:10大实战攻略,轻松年赚1-20万

对于众多上班族而言&#xff0c;如何在工作之余赚取额外收入&#xff0c;开启自己的第一份副业&#xff0c;已成为许多人心中的疑问。每个人的才能和兴趣点不尽相同&#xff0c;但都有机会找到适合自己的兼职方式。接下来&#xff0c;就让我们一起探索这10大实战攻略&#xff0…

Google Ads谷歌广告账户被封停怎么办?

跨境出海业务少不了需要做Google Ads推广业务&#xff1b;其中让投手们闻风丧胆的消息就是帐户被暂停。当 Google 检测到任何违反其政策且可能损害用户在线体验的行为时&#xff0c;就会发生这种情况。那么如何在做广告推广的同时&#xff0c;保证账号不被封禁呢&#xff1f;看…

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书

设计摘要&#xff1a; 本设计基于STM32单片机&#xff0c;旨在实现一个智能安防系统&#xff0c;主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作&#xff0c;实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…

AI高清逼真换脸换装

在我们的最新AI换脸换装技术中&#xff0c;我们将高度真实的视觉效果与创新的人工智能技术相结合&#xff0c;提供了前所未有的个性化数字体验。无论是为了娱乐、广告、电影制作还是个人化虚拟体验&#xff0c;我们的技术都能让你的想象无缝转换为现实。通过我们的平台&#xf…

Linux命令使用

一、ls tree clear 1.1 ls ls&#xff1a;查看当前目录下的文件名ls 目录名&#xff1a;查看指定目录下的文件名ls /&#xff1a;查看根目录下的文件名ls -a&#xff1a;查看当前目录下的所有文件名&#xff0c;包括隐藏文件ls -l&#xff1a;查看当前目录下文件的详细信息…

Blender雕刻建模_笔刷纹理和顶点绘制

笔刷纹理 主要用于皮肤&#xff0c;纹理的雕刻。 可以修改映射方式来实现不同绘制效果。 用一张纹理来定义笔刷各个点的强度。其中白色为1&#xff0c;黑色为0。 设置笔刷纹理步骤&#xff1a; -新建一套笔刷 -强度&#xff0c;设为0.15&#xff08;可以根据需求修改&#x…