C++——string的使用

news2024/11/26 20:30:28

string的使用

  • 1. STL
  • 2. string
    • 2.1 初始化和遍历
    • 2.2 容量相关
    • 2.3 串的修改
    • 2.4 其他接口

1. STL

STL全称 standard template libaray——标准模板库,内部包含了很多数据结构和算法,数据结构包括栈,队列,树,链表等,算法包括交换,排序,查找,逆置等。是一个C++标准库的重要组成部分。STL不止含有这两部分,接下来就慢慢进入STL的学习,先从使用开始。

这里有一个网址,大家可以在这个网址上学习

https://legacy.cplusplus.com/

2. string

string就是字符串,它其实是类模板实例化出来的一个类,存储的是字符
在这里插入图片描述

2.1 初始化和遍历

初始化是通过构造函数进行的,先来看看有哪些吧
在这里插入图片描述
第一个默认构造;第二个拷贝构造,通过一个已存在的对象初始化;第三个通过存在对象的部分内容初始化;第四,五个都是通过字符串来初始化;第六个是通过n个字符初始化;最后一个是通过迭代器区间初始化。用的比较多的是第2,3,4,5个。

在string和vector(顺序表)中迭代器的使用和指针基本类似。后续会介绍迭代器具体是什么。

遍历方式1:下标 + [ ]
string类重载了operator[ ],可以通过类似数组那样的方式遍历string对象。
在这里插入图片描述
遍历方式2:范围for循环遍历
遍历方式3:迭代器遍历

迭代器类似指针
在这里插入图片描述
begin可以获得string第一个字符的地址,end可以获得string最后一个字符的下一个位置的地址。
rbegin可以获得string反向的第一个字符的地址,即最后一个字符的地址;rend可以获得string的反向的最后一个字符的下一个位置的地址。如下图

在这里插入图片描述
最后四个是对const对象新增的函数,但是前四个已经重载了const版本的,所以后四个不需要使用。
并且每一种容器都有迭代器,因此使用时,需要指定类域。返回值类型大家可以点进去自行查看。

对于这三种遍历,给出如下实例代码。

#include<iostream>
#include<string>
using namespace std;
void test2()
{
	//使用字符串来初始化,for循环+下标+ [ ]遍历
	string s1("ABCDEFG");

	//for循环
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i];
	}
	cout << endl;

	//拷贝构造初始化,范围for遍历
	string s2(s1);
	for (auto ch : s2)
	{
		cout << ch;
	}
	cout << endl;

	//n个字符初始化,迭代器遍历
	string s3(10, 'B');
	string::iterator i = s3.begin();
	while (i != s3.end())
	{
		cout << *i;
		i++;
	}
	cout << endl;

    //反向遍历
	const string s4 = s1;
	string::const_reverse_iterator ci = s4.rbegin();
	while (ci != s4.rend())
	{
		cout << *ci;
		ci++;
	}
	cout << endl;
}

int main()
{
	test2();
	return 0;
}

运行结果如下图
在这里插入图片描述

总结:推荐使用下标 + [ ] ,可以正向遍历,也可以逆向遍历;范围for不支持逆向遍历。迭代器可读性较差。对于后续的无法使用下标 + [ ] 遍历的,就要使用迭代器遍历了。

2.2 容量相关

在这里插入图片描述
sizelength都是获得字符串的大小;

string s(“ABCDEFG”);
cout<<s.size()<<endl;

max_size是获得可初始化的最长字符串的长度(没有什么作用);

resize是更新string对象size的大小。
capacity是获得string对象capacity的大小,vs上默认是16

#include<iostream>
#include<string>
using namespace std;
void test3()
{
	string s("ABCDEFG");
	cout <<"更新前size = "<< s.size() << endl;
	cout <<"更新前capacity = "<< s.capacity() << endl;
	s.resize(20);
	cout << "更新后size = " << s.size() << endl;
	cout << "更新后capacity = " << s.capacity() << endl;
	
}

int main()
{
	test3();
	return 0;
}

运行结果如下
在这里插入图片描述
当更新的size超过15时,会更改capacity的大小,原因是空间不够需要扩容。
下面这段代码可以观察vs是如何扩容的。

void test_capacity()
{
	string s;
	//保留原大小
	size_t capacity = s.capacity();
	cout << "capacity:" << s.capacity() << endl;
	//循环插入字符A,空间不够会扩容
	for (int i = 0; i < 200; i++)
	{
		s += 'A';
		//扩容时打印
		if (capacity != s.capacity())
		{
			cout <<  s.capacity() << endl;
			capacity = s.capacity();
		}
	}
}

运行结果如下
在这里插入图片描述
起始值是15,第一次扩容为2倍,后续都是1.5倍。扩容的消耗很大,因此如果事先能知道需要多少空间,可以一次开完全就不会造成这样的消耗了。

reserve可以扩充容量,用法如下

string s;
s.reserve(扩容后的大小)

还是上面的代码,如果实现就给好200个空间。那么就不需要扩容了。
在这里插入图片描述
运行结果可以看出,没有扩容,但是容量不是200,它可能多给空间,但不会少给。
但是给的数值如果小于原来的空间,这个函数就不做处理。

总结:resize会改变size,可能改变capacity;reserve会改变capacity,不会改变size

clear可以将字符串内容清空,使之变成空串,改变size(变为0),不改变capacity
empty判断是否是空串。
shrink_to_fit可以缩小串的容量(不建议使用,因此不做详谈)

2.3 串的修改

在这里插入图片描述
**operator+=**是重载的运算符,可以尾插一个字符串或字符或string对象
在这里插入图片描述
push_back尾插一个字符
append用法较多,但不如operator+=方便,可读性也不如operator+=,因此不做过多介绍。
insert用法也比较多,这里介绍和演示几个较为常用的。
在这里插入图片描述
第一个:在pos位置插入一个string对象;第三个:在pos位置插入一个字符串;第四个:在pos位置插入字符串的n个字符;第五个:在pos位置插入n个字符

在这里插入图片描述
assign是给该字符串一个新的值,替换当前的内容,用法和初始化很类似。
erase为删除字符
在这里插入图片描述
第一个:删除pos位置的len个字符,不给实参或者len超过字符串的长度时,将全部删除。npos为整型的最大值。
第二个:删除一个迭代器位置的字符
第三个:删除一段迭代器区间

在这里插入图片描述

swap为交换两个string对象
pop_back为删除最后一个字符

2.4 其他接口

在这里插入图片描述
c_str和data可以获得c类型的字符串。如下图
在这里插入图片描述

这两个函数获得的是**_str**,因为有些C语言的接口操作的是字符串,不是string对象。

find和rfind分别是正向和反向找第一个符合条件的字符或字串。找到返回下标,找不到返回npos
比如我们要打印这句英文的第一个和最后一个单词Life is full of possibilities可以这样写。

void test_string2()
{
	string s = "Life is full of possibilities";
	size_t pos = s.find(' ');  //拿到第一个空格的下标,即4

	string sbegin = s.substr(0,pos);//拿到字串,从下标为0到下标为pos位置之前,左闭右开 [0 ,pos)
	cout << sbegin << endl;
	size_t pos1 = s.rfind(" ");//拿到最后一个空格的下标
	string send = s.substr(pos1 + 1);//拿到字串,从pos1+1开始,没有右区间,就会取完全部字符
	cout << send << endl;
}

运行结果如下
在这里插入图片描述
substr为获取字串,上面已经有介绍用法了,这里看下函数原型,就不多解释了。
在这里插入图片描述
compar为比较两个串的大小,原理和strcmp一样。
在这里插入图片描述
其他函数用的很少,大家可以自己对照文档了解。关于string常用函数接口的解释就到这里了。

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

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

相关文章

[JAVASE] 类和对象(一)

目录 一.类的基本定义 1.1 类与对象 1.2 类的定义 二. 类的实例化 2.1 创建引用 三. 类中成员的访问 3.1 基本实现 3.2 this引用 四. 构造与初始化 4.1 初始化 4.2 构造方法 五. 总结 一.类的基本定义 1.1 类与对象 类对应着对象 1.2 类的定义 二. 类的实例化 2.1 创建引用…

Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

前言 上一篇文章带你实现了Go-Zero和goctl&#xff1a;解锁微服务开发的神器&#xff0c;快速上手指南&#xff0c;本文将继续深入探讨Go-Zero的强大之处&#xff0c;并介绍如何使用goctl工具实现模板定制化&#xff0c;并根据实际项目业务需求进行模板定制化实现。 通过本文…

爬虫学习--1.前导知识

初始爬虫 前言引入 随着大数据时代的来临&#xff0c;网络爬虫在互联网中的地位将越来越重要。互联网中的数据是海量的&#xff0c;如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题&#xff0c;而爬虫技术就是为了解决这些问题而生的。 我们感兴趣的…

java学习笔记反射机制

2.关于反射的理解 Reflection&#xff08;反射)是被视为动态语言的关键&#xff0c;反射机制允许程序在执行期借助于Reflection API取得任何 类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。 框架 反射 注解 设计模式。 3.体会反射机制的“动态性” //…

Mybatis之ResultMap

前言 select语句查询得到的结果集是一张二维表&#xff0c;水平方向上看是一个个字段&#xff0c;垂直方向上看是一条条记录。而Java是面向对象的程序设计语言&#xff0c;对象是根据类定义创建的&#xff0c;类之间的引用关 系可以认为是嵌套的结构。在JDBC编程中&#xff0c…

政务服务电子文件归档和电子档案管理系统,帮助组织收、管、存、用一体化

作为数字政府建设的重要抓手&#xff0c;政务服务改革经过多年发展&#xff0c;截至 2022 年底&#xff0c;全国一体化在线政务服务平台实名用户超过10亿人&#xff0c;在政务服务、办件过程中出现了大量需要归档的电子文件&#xff0c;对于电子档案、电子证照的需求愈加强烈。…

Sql Server 2016数据库定时备份

一、 配置备份计划任务 选中“维护计划“--右键--“维护计划向导” 完成

2024 年 数维杯(C题)大学生数学建模挑战赛 | 天然气水合物资源 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 CS团队倾注了大量时间和心血&#xff0c;深入挖掘解决方案。通…

1.python爬虫爬取视频网站的视频可下载的源url

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、爬取的源网站二、爬取过程详解1.首先我们需要解析网站的源码&#xff0c;按F12&#xff0c;在Elements下查看网站的源码2.获取视频的页数3.获取每一页所哟视频的…

基于FPGA实现的HDMI TO MIPI扩展显示器方案

FPGA方案&#xff0c;HDMI IN接收原始HDMI 信号&#xff0c;输出显示到LCD 屏上 客户应用&#xff1a;扩展显示器 主要特性&#xff1a; 1.支持2K以下任意分辨率显示 2.支持OSD 叠加多个图层 3.支持MIPI/EDP/LVDS/RGB屏 4.支持放大缩小匹配屏分辨率 5.零延时&#xff0c;输…

从零学算法42

42.接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

蚂蚁面试:DDD外部接口调用,应该放在哪一层?

尼恩说在前面&#xff1a; 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; DDD 的外部接口调用&#xff0c;应该放在…

Java方法和数组

方法 Java中的方法就是c语言中的函数。 方法的定义 定义格式如下 修饰符 返回值 方法名([参数列表]){代码块[return 返回值;] } //方括号[]括起来代表可以没有&#xff0c;不是必须有的方法名采用小驼峰命名&#xff08;就是有多个单词&#xff0c;第一个单词首字母小写其…

阅读送书抽奖?玩转抽奖游戏,js-tool-big-box工具库新上抽奖功能

先讨论一个问题&#xff0c;你做软件工作是为了什么&#xff1f;从高中选专业&#xff0c;就喜欢上了软件开发&#xff1f;还是当初毕业不知道干啥&#xff0c;不喜欢自己的专业&#xff0c;投入软件开发的怀抱&#xff1f;还是干着干着别的&#xff0c;突然觉得互联网行业真不…

前端技术交流群

欢迎来到前端筱园用户交流&#xff01;这是一个专注于前端编程技术、学习资源和行业动态的讨论平台。在这里&#xff0c;你可以分享经验、提问、回答问题&#xff0c;与其他前端开发者一起学习和成长。 &#x1f31f;亲爱的朋友们&#x1f31f; 大家好&#xff01;感谢你们一直…

《Tam》论文笔记(下)

3 Method 3.1. The Overview of Temporal Adaptive Module 正如我们在第1节中讨论的&#xff0c;视频数据通常表现出由相机运动和速度变化等因素引起的复杂时间动态。因此&#xff0c;我们的目标是通过引入具有视频特定内核的时间自适应模块 (TAM) 来解决这个问题&#xff0c…

一键自动化博客发布工具,用过的人都说好(infoq篇)

infoq的博客发布界面也是非常简洁的。首页就只有基本的标题&#xff0c;内容和封面图片&#xff0c;所以infoq的实现也相对比较简单。 一起来看看吧。 前提条件 前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下&#xff1a;https://github.c…

营收如泡沫,利润如刀片,万辰集团万店梦想下的阴影

&#xff08;作者注&#xff1a;本文建议配乐《泡沫》阅读&#xff01;&#xff09; 从“食用菌第一股”转型为“量贩零食第一股”的首个财年&#xff0c;万辰集团新业务发展迅猛。 财报显示&#xff0c;2023年公司量贩零食业务实现营业收入87.59亿元&#xff0c;同比增长1305…

微火全域运营平台的优缺点分别是什么?

随着全域运营赛道的兴起&#xff0c;微火全域运营平台在市场占有率持续走高&#xff0c;与之相关的各类问题也层出不穷。其中&#xff0c;微火全域运营平台是什么、微火全域运营平台的优缺点等与平台本身相关的问题长期位居话题榜前列。 所谓微火全域运营平台&#xff0c;就是由…

京东手势验证码-YOLO姿态识别+Bézier curve轨迹拟合

这次给老铁们带来的是京东手势验证码的识别。 目标网站&#xff1a;https://plogin.m.jd.com/mreg/index 验证码如下图: 当第一眼看到这个验证码的时候&#xff0c;就头大了&#xff0c;这玩意咋识别&#xff1f;&#xff1f;&#xff1f; 静下心来细想后的一个方案&#xf…