C++中string使用

news2024/12/25 9:06:17

目录

介绍

使用

迭代器(Iterator)

begin,end

rbegin,rend

容量(Capacity)

size,length

 capacity

 empty

clear

resize

reserve

元素访问(Element access)

operator[]

at

front,back

修饰符(Modifier)

opreator+=

push_back

insert

erase

pop_back

操作(operation)

c_str

copy

find

rfind

substr


介绍

     string属于STL(Standard Template Library,标准模板库)中容器的一部分。容器是用来存储和管理数据的对象。

     string表示字符串的字符串类。string的出现的时间比STL还要早所以里面的有些接口就会有点冗余。要使用string的话要加上名为<string>的头文件。这是关于使用string的网址:string,这里我就只是简单介绍一下某些接口的使用。

使用

迭代器(Iterator

     迭代器(iterator)是一种用于遍历容器中元素的对象。它提供了一种统一的方式来访问不同类型容器中的元素,无需了解容器的内部实现细节。这是封装的一种体现。

begin,end

     begin:返回字符串第一个字符的迭代器,end:返回字符串最后一个字符的迭代器。

     如果是空字符串使用它们会返回指向该空字符串起始位置的迭代器。利用它们就可以实现字符串的遍历。例:

#include <iostream>
#include <string>
using namespace std;

void print(string& s)
{
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it;
		it++;
	}
}

int main()
{
	string s("hello world");

	print(s);
	return 0;
}//下面会频繁用到print这个函数

90fc77885c194ab0974fe90e2a51f0c5.png

     大家可能注意到了这个:

5095dbcd1466432282eb8d80961ab6be.png

     第一个it前面有个*号,第二个it后面面有个++。这里大家可能猜到了这就是指针!这里的迭代器也确实可以简单认为是指针,因为string开辟的空间是连在一起的。但是后面得list开辟的空间不是连续的就不能简单认为迭代器是指针。但是后面的list用迭代器遍历也是这样写的因为使用了运算符重载。

     如果不用对字符串里的内容修改就可以用cbegin,cend。这时候迭代器就要改为const_iterator。

int main()
{
	string s("hello world");

	string::const_iterator it = s.cbegin();
	while (it != s.cend())
	{
		cout << *it;
		it++;
	}
	return 0;
}

rbegin,rend

     前面的r其实是reverse(“反转”“颠倒”“逆向”),所以rbegin:返回最后一个字符的迭代器,rend:返回第一个字符的迭代器。这时候迭代器就要改为reverse_iterator。这时就可以实现逆序打印字符串。例:

int main()
{
	string s("hello world");

	string::reverse_iterator it = s.rbegin();
	while (it != s.rend())
	{
		cout << *it;
		it++;
	}
	return 0;
}

79f5acb9ee8644ada8795647de127e92.png

     大家可能好奇为什么不设计--来实现逆序打印。其实是为了保持语言的一致性、清晰性、可维护性。

     如果不用对字符串里的内容修改就可以用crbegin,crend。这时候迭代器就要改为const_reverse_iterator。

容量(Capacity

size,length

     以字节为单位返回有效字符串的长度。

     size和length的功能是一样的,这是因为string设计的比STL要早原来的string里没有size为了实现统一性就设计了size。使用例子:

int main()
{
	string s("hello world");

	cout << s.size();

	return 0;
}

9f5efba85ea2428ea99a6bb6b69a0dcc.png

 capacity

     以字节为单位返回当前为字符串分配的存储空间大小。使用例子:

int main()
{
	string s("hello world");

	cout << s.capacity();

	return 0;
}

562b909c28e8475fa795acead93e0287.png

 empty

     这是判断字符串是否为空。为空则真,否则为假。使用例子:

int main()
{
	string s("hello world");

	cout << s.empty();

	return 0;
}

8fe5ee1680ae4b37b5a1a3eec83f649c.png

clear

     将字符串里的所有的字符删除。使用例子:

int main()
{
	string s("hello world");

	s.clear();

	print(s);
	return 0;
}

e798afb4af3e48d0b2edec0efb79c204.png

resize

     将字符串调整为长度为 n 个字符。

  • 如果n小于字符串的长度

          如果n小于字符串的长度,会保留第一个到第n个之间的所有字符,后面的字符都会被移除。使用例子:

int main()
{
	string s("hello world");

	s.resize(5);

	print(s);
	return 0;
}

2a30e0fdaf7a4943856e0095b0cd5905.png

  • 如果n大于或等于字符串的长度

          如果n大于或等于字符串的长度就会从最后一个字符开辟n - l(字符串的长度)。可以在最后一个字符的后面新增新的字符,也可以不新增。使用例子:

int main()
{
	string s("hello world");

	s.resize(15, 'a');

	print(s);
	return 0;
}

4c834bc7e6f7472db152eeba60cd7efa.png

reserve

     用于预分配n个字符数量的内存空间以容纳字符串内容,使其能够容纳最多 n 个字符。

     如果 n 大于当前字符串的容量,这个函数会使容器增加其容量到 n 个字符(或更多)。其他情况下,它被视为一个非约束性的请求来缩小字符串容量(一般不会缩小)。使用例子:

int main()
{
	string s("hello world");

	s.reserve(20);
	cout << s.capacity();

	return 0;
}

78ae7cf38edf471b8fce36a4a6d3e4bd.png

     大家可能发现了这里的值是31并不是20。因为扩容是按照固定的倍数扩的编译器具体扩多大是由它决定的。我们想把容量变成20其实对于编译器来说就只是一个建议,编译器可能会扩成20也有可能扩成比它大的某数字。

元素访问(Element access

operator[]

     获取字符串中pos位置的字符,并返回字符串中 pos 位置的字符的引用。

     如果访问超出字符串长度的位置,会导致未定义行为。可能出现程序崩溃、产生错误的结果等。这个就很像是数组里的下标运算符。事实上它就是重载了数组里的下标运算符。使用例子:

int main()
{
	string s("hello world");

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

	return 0;
}

fe8dbe4d72d04caa881b7f3287ab6032.png

at

      at和上面的operator[]几乎一样,也是访问字符串里的字符并返回该字符引用。如果访问的位置超出字符串长度就会抛异常。使用例子:

int main()
{
	string s("hello world");

	for (size_t i = 0; i < s.size(); i++)
	{
		cout << s.at(i);
	}

	return 0;
}

8f2d55b41de64421ac707b1360edeec5.png

front,back

     front,back和上面的begin,end几乎一样只不过,front:返回的是第一个字符的引用,back:返回的是最后一个字符的引用。空字符串里不能使用它们。使用例子:

int main()
{
	string s("hello world");

	s.front() = 'A';
	s.back() = 'A';

	print(s);
	return 0;
}

550c1a5c71be4f98902b8c460fca094e.png

修饰符(Modifier

     对字符串进行各种操作和变换,以满足不同的需求。

opreator+=

     在字符串末尾添加字符或字符串,并增加有效长度。该接口会返回字符串类的引用。使用例子:

int main()
{
	string s("hello world");

	s += ' ';
	s += "abc";

	print(s);
	return 0;
}

e7968cb255384fd2b1134f120cb8ba45.png

push_back

     在字符串末尾添加字符,使有效地将其长度增加一个。使用例子:

int main()
{
	string s("hello world");

	s.push_back('a');

	print(s);
	return 0;
}

1797a73c852f4880863198616566870f.png

insert

     在字符串的指定pos位置之前插入字符或字符串。

     第一个参数是插入位置的下标,如果插入位置的下标超出字符串长度就会抛异常。第二个参数可以是字符串,可以是字符但要在字符写要插入字符的长度。该接口返回字符串类的引用。使用例子:

int main()
{
	string s("hello world");

	const char* str = "---";
	s.insert(0, 1, 'a');
	s.insert(1,str);

	print(s);
	return 0;
}

095f30a953a24863b90accbe5f6d5c24.png

erase

     擦除字符串的一部分,减少其有效长度。

     第一个参数是要擦处位置的下标,如果擦除位置的下标超出字符串长度就会抛异常 。第二个参数是要删除字符的长度。如果要删除字符的长度不写或超出字符串有效长度就会把后面的所有的字符都删除。使用例子:

int main()
{
	string s("hello world");

	s.erase(0, 1);

	print(s);
	return 0;
}

c7fdc39c1c784199bfa326937dfb6e0a.png

     如果没接len:

a5f94deac499403c995c0e8764f984ef.png

pop_back

     在字符串末尾删除字符,使有效地将其长度减少一个。使用例子:

int main()
{
	string s("hello world");

	s.pop_back();

	print(s);
	return 0;
}

46117966ecde4bce8ffcd4fc01b9b696.png

操作(operation

     对字符串进行一些操作例如查找,复制等。

c_str

     该接口会返回一个指向字符数组的指针。使用例子:

int main()
{
	string s("hello world");

	const char* p = s.c_str();
	printf("%p", p);
	cout << endl << p;

	return 0;
}

a6fa7a6ff7ed44d3ab72644ff26326ff.png

     大家可能注意到了cout << p直接就打印了p的内容了,这是因为string里重载了<<。

copy

     将字符串里的内容拷贝到字符数组里,需要注意的是并不会拷贝'\0'。该接口返回实际拷贝的字符数。

     第一个参数的位置是字符数组指针,第二个参数是要拷贝字符的长度,第三个参数是字符串里开始拷贝位置的下标(默认是0)。使用例子:

int main()
{
	string s("hello world");

	char buffer[20];
	size_t len = s.copy(buffer, 5);
	buffer[len] = '\0';
	cout << buffer;

	return 0;
}

6384c8970ab840b9bc03fdea5a2f6822.png

find

     查找pos位置之后第一次出现的字符和字符串。

     第一个参数是要查到的字符串或字符,第二个参数是查找的起始位置pos(默认是0)。如果找到会返回该下标位置,否则返回npos。使用例子: 

int main()
{
	string s("hello world");

	size_t i = s.find('o');
	i != s.npos ? cout << "找到了,下标是" << i: cout << "没找到";

	return 0;
}

307101b5985e4af2a69d8444f84a0ff9.png

npos:

  1. 当在字符串的成员函数中作 len 参数的缺省值时,这时意味着“直到字符串的末尾”。
  2. 作为返回值,它通常用于表示没有匹配。
  3. 这个常量被定义为值 -1,由于 size_t 是一个无符号整数类型,所以这是该类型的最大可表示值。

rfind

     查找pos位置之前第一次出现的字符和字符串。

     第一个参数是要查到的字符串或字符,第二个参数是查找的起始位置pos(默认是npos)。如果找到会返回该下标位置,否则返回npos。使用例子:

int main()
{
	string s("hello world");

	size_t i = s.rfind('o');
	i != s.npos ? cout << "找到了,下标是" << i : cout << "没找到";

	return 0;
}

68477cd211cf4eda98dd7a43ef1f7b82.png

substr

     从字符串里提取子字符串。

     第一个参数是子字符串开始的位置,第二个参数是提取子字符串的长度(如果不写会从起始位置到字符串结束)。该接口返回字符串类。使用例子:

int main()
{
	string s("hello world");

	string str = s.substr(0, 5);
	print(str);

	return 0;
}

57c89c7759b1488689be2e37828ae86e.png

     上面我所提到的接口一定要多练习,千万不要只看不练。

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

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

相关文章

美国陆军发布下一代目标识别和感知倡议

文章目录 前言一、下一代目标识别与感知倡议的内容二、下一代目标识别与感知倡议重点关注领域(1)目标标记、跟踪和定位 (TTL)(2)侦察和监视 (R&S)(3)无人系统 (UMS)前言 2024年7月23日,美国陆军发布了下一代目标识别与感知倡议,希望工业界能够开发战场态势感知、侦…

LeetCode 692.前K个高频单词

LeetCode 692.前K个高频单词 C 思路&#x1f9d0;&#xff1a; 首先用map存储该字典&#xff0c;然后放进vector进行排序&#xff0c;注意sort的排序规则与我们想要的规则不一致&#xff0c;所以我们需要写一个伪函数来判断second(value值)&#xff0c;由于该题要求了稳定性&am…

Rider使用习惯

1.修改rider的快捷方式为VSCode样式的&#xff0c;修改设置方式 2.在项目中点击某个脚本文件&#xff0c;即在项目视图中选中这个文件&#xff0c;设置方式如下&#xff1a; 暂时先记录这么多&#xff0c;以后有零碎的随时记录

VUE,element-ui,优化tabs组件每次点击,所有子页面都重新渲染问题

1.在data中定义每个子组件相应的值&#xff0c;ture为加载&#xff0c;false为不加载。 2.在子组件中使用v-if来判断是否渲染当前页面 3.在函数中对子组件的值进行切换。 handleClick(){if(this.activeNamefirst){this.pageOne truethis.pageTwo false}else if(this.active…

通过 4EVERLAND 的终极 4EVER Boost 活动增强你的活动能力!

介绍 近日&#xff0c;4EVERLAND宣布启动最新、最激动人心的计划 — 4EVER Boost 活动&#xff01;4EVER Boost 活动旨在吸引更多社区成员加入并加速去中心化物理基础设施4EVER 网络的发展。用户可以参与节点质押、日常任务和 T4EVER/NFT 质押&#xff0c;以加快获得 $4EVER 积…

Spring Security认证与授权

1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员&#xff0c;因此它伴随着整个Spring生态系统不断修正、升级&#xff0c;在spring boot项目中加入springsecurity更是…

隔离DCDC模块B0505/B0503对RS485和CAN总线进行电源隔离

CAN和485都是工业通信中常用的现场总线&#xff0c;做好通信总线的隔离防护是产品可靠、稳定的重要前 提。 一、通信总线为什么要隔离&#xff1f; 目前大多数产品对外通讯部分可总结为&#xff1a; MCU收发器外部总线&#xff0c;其中大多数常用的MCU都集成有CAN或UART链路层…

Linux中的简单命令2

一.echo指令 echo的作用是显式文本内容 #echo ‘字符串’ #echo “字符串” echo会将后面的内容当作字符串直接打印在屏幕上&#xff0c;后面的内容需要用单引号或者双引号括起来 注意&#xff1a;echo会自动在字符串后面加上一个换行符。 可以与printf进行对比&#xff1a; …

从Zotero6到Zotero7的数据迁移尝试?(有错勿喷,多多指教!)

从Zotero6到Zotero7的数据迁移尝试 0 前言 之前在主机上一直用的Zotero6&#xff08;实验室主机&#xff09;&#xff0c;最近发现在个人笔记本上看论文更频繁&#xff0c;尝试重新部署Zotero&#xff0c;才发现竟然更新了&#xff01;所以这里简单记录一下数据迁移过程&…

水厂中的反冲洗工艺

滤池作为水厂的重要的处理单元之一,滤池的形式多种多样,但其截留水中杂质的原理基本相同。我们以常见的V型滤池为例,介绍一下水厂中的反冲洗工艺。 V型滤池是快滤池的一种形式,因为其进水槽形状呈V字形而得名,也叫均粒滤料滤池(其滤料采用均质滤料,即均粒径滤料)、六阀滤…

代码随想录算法训练营第14天|226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度

目录 226. 翻转二叉树1、题目描述2、思路3、code&#xff08;后序递归&#xff09; 101. 对称二叉树1、题目描述2、思路3、code 104. 二叉树的最大深度1、题目描述2、思路3、code 111. 二叉树的最小深度1、题目描述2、思路3、code 226. 翻转二叉树 题目链接&#xff1a;link …

2024年最新软件测试学习路线图(从入门到精通)

六维全息课程注重综合能力培养&#xff0c;从入学到职后一站式服务测试开发人才。2024年最新软件测试学习路线图&#xff0c;从入门到精通一应俱全。 9阶段专业课11大专项测试项目 适应互联网企业测试开发需求。 对于想入行学软件测试的新手来说&#xff0c;首先就需要一个高效…

GESP等级考试 C++二级-if语句

if语句是C中的选择语句&#xff0c;通过if语句程序可以在一种可能、二种可能或者多种可能中做出选择&#xff0c;对于不同的可能进行不同的处理。 1 一种可能 使用if语句对一种可能进行处理的格式如下所示&#xff1a; if (表达式) {语句; } 其中&#xff0c;if后面跟一个圆…

预报名来啦!25届考研所有重要时间节点和注意事项一览

预报名即将开始&#xff0c;学姐给大家准备了&#xff0c;详细的报考流程及常见问题&#xff0c;每年都有学生因为报名出问题导致没法参加考试&#xff0c;大家一定要认真对待哦~ 一.报名时间及流程 01 预报名时间 2024年9月24日至9月27日&#xff0c;9:00—22:00 02 预报名…

高校课堂教学管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程分类管理&#xff0c;课程资源管理&#xff0c;互动论坛&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程资源&#xff0…

HarmonyOS ArkUI 构建布局

文章目录 一、构建布局1.线性布局 (Row/Column)1.1 Blank空白填充组件1.2 layoutWeight 自适应缩放1.3 自适应延伸 2.弹性布局 (Flex)3.栅格布局 (GridRow/GridCol)3.创建列表 (List) 一、构建布局 1.线性布局 (Row/Column) 线性布局文档 通过线性容器Row和Column构建 Column…

QT之QML学习五:添加自定义Qml组件,以及组件管理

开发环境: 1、Qt 6.7.2 2、Pyside6 3、Python 3.11.4 4、Windows 10 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!!…

怎么看待伦敦银交易的风险与收益?

伦敦银交易的风险与收益&#xff0c;在宣传材料中&#xff0c;伦敦银是一种潜在收益很高&#xff0c;潜在风险不大的品种。然而在实践中我们发现&#xff0c;伦敦银交易好像并不如宣传材料说的那样容易做。那么&#xff0c;具体伦敦银交易的风险和收益是怎么样的&#xff1f;那…

Python:只需20行代码,一键下载网络热门短剧,简直不要太爽!

网络短剧铺天盖地&#xff0c;主打的就是一个爽字&#xff0c;但有有些博主就是不当人&#xff0c;喜欢一剪没&#xff0c;正当我们看的津津有味的时候&#xff0c;进度条却到底了&#xff01;&#xff01;&#xff01; 对于大家来说&#xff0c;想看续集&#xff0c;都是全凭实…

力扣第560题 和为k的子数组

前言 记录一下刷题历程 力扣第560题 和为k的子数组 和为k的子数组 原题目&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums …