C++—string类接口与用法大总结(其中涉及STL基础)

news2024/9/20 1:21:24

目录

1.string类的本质

2.string类的构造

1.普通构造

2.功能型构造

1.拷贝构造功能型

2.带参构造功能型

3.其余构造

3.operator[]

4.迭代器(iterator)

1.概念

2.改变string对象本身

3.正向迭代器(iterator)

4.反向迭代器(reverse_iterator)

5.const迭代器

1.const正向迭代器(const_iterator)

2.const反向迭代器(const_reverse_iterator)

5.范围for(遍历与修改)

0.auto

1.概念

2.不改变string对象本身

3.改变string对象本身

6.容量系列

1.size:求有效数据个数(不算'\0')

2.capacity:求顺序表容量

3.reserve:用于扩容和缩容

1.扩容:

2.缩容:

7.增删系列

1.push_back:尾插一个字符

2.append:尾插一个字符串

3.operator+=:拼接字符或字符串

4.insert:在指定下标插入字符串或字符

1.插入字符串:

2.插入字符:

5.erase:从指定下标开始删除k个字符

8.replace:替换

9.find:查找(找到指定内容并返回其第一次出现的下标)

10.swap:交换函数

11.c_str:返回string类的指针成员变量(本质是为了兼容C语言)

12.substr:从某个下标开始的k个字符构造成一个新的string对象并返回

13.find_first_of:从s1中找是否存在我传过去的字符串中的任意一个字符,如果比对成功则返回下标

14.operator+

15.getline:默认遇到\n才会停止在缓冲区中取数据(cin默认遇到空格和\n就会停止在缓冲区中取数据)


1.string类的本质

string类是由字符组成的顺序表。

2.string类的构造

1.普通构造

#include <iostream>
#include <string>
using namespace std;
int main()
{
	//默认构造
	string s1;
	//带参构造
	string s2("111111");
	//拷贝构造
	string s3(s2);

	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
}

结果:

2.功能型构造

1.拷贝构造功能型

string s1("hello world");

//拷贝构造功能型

//从下标为6的字符开始拷贝5个字符
string s2(s1, 6, 5);
//如果第三个参数超出了字符串的范围,就是从下标为6开始、打印完就结束
string s3(s1, 6, 50);
//省略第三个参数的话,就是从下标为6开始、打印完就结束
string s4(s1, 6);

cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;

结果:

2.带参构造功能型

//拿字符串前5个字符构造
string s1("hello world",5);
cout << s1 << endl;

结果:

3.其余构造

//拿10个X组成字符串构造
string s1(10, 'X');
cout << s1 << endl;

结果:

3.operator[]

string类中重载了[]运算符,使其能够像数组一样使用。

class string
{
public:
	char& operator[](int x)
	{
		return arr[x];
	}

private:
	char* arr;
	int size;
	int capacity;
};

用引用返回是为了能够改变指定下标的值。

string s1("hello world");
s1[0] = 'X';
cout << s1 << endl;

结果:

4.迭代器(iterator)

1.概念

s1.begin()指向第一个元素,s1.end()指向最后一个元素的下一个元素。(最后一个元素指的是最后一个有效元素)

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

注意:这里的it可以当指针理解,但本质不一定是指针。

结果:

2.改变string对象本身

string s1("hello");
string::iterator it = s1.begin();
while (it != s1.end())
{
	//这里会改变s1的每个变量
	*it += 2;
	it++;
}
cout << s1 << endl;

结果:

3.正向迭代器(iterator)

s1.begin()指向第一个元素,s1.end()指向最后一个元素的下一个元素。(最后一个元素指的是最后一个有效元素)

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

结果:

4.反向迭代器(reverse_iterator)

rbegin指向最后一个元素,rend指向第一个元素的前一个元素。

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

结果:

5.const迭代器

1.const正向迭代器(const_iterator)

const string s3("hello world");
string::const_iterator cit = s3.begin();
while (cit != s3.end())
{
	//不能*cit += 2;
	cout << *cit << " ";
	++cit;
}
cout << endl;

2.const反向迭代器(const_reverse_iterator)

const string s3("hello world");
string::const_reverse_iterator rcit = s3.rbegin();
while (rcit != s3.rend())
{
	// 不能*rcit += 2;
	cout << *rcit << " ";
	++rcit;
}
cout << endl;

5.范围for(遍历与修改)

范围for适用于容器和数组

0.auto

auto是用来自动推导类型的。

string s1("hello");
//string::iterator it = s1.begin();

//这里的迭代器也可以这么写:
auto it = s1.begin();
//这样写编译器会自动推导出auto此时的位置应该是一个迭代器类型

auto存在的目的是为了简化代码,但弊端就是降低了代码的可读性。

1.概念

string s2("hello");
//范围for底层是一个迭代器
//这里的x相当于拷贝的*it
for (auto x : s2)
{
	cout << x << "  ";
}

结果:

2.不改变string对象本身

string s2("hello");
//范围for底层是一个迭代器
//这里的x相当于拷贝的*it
for (auto x : s2)
{
	//这里不会改变s2字符串本身,因为x变量只是拷贝
	x += 2;
	cout << x << "  ";
}

cout << endl << s2 << endl;

结果:

3.改变string对象本身

string s2("hello");
//范围for底层是一个迭代器
//这里的x相当于*it的别名
for (auto& x : s2)
{
	//这里会改变s2字符串本身,因为x变量是引用的s2中的每一个变量
	x += 2;
	cout << x << "  ";
}

cout << endl << s2 << endl;

结果:

6.容量系列

1.size:求有效数据个数(不算'\0')

string s1("hello");
cout << s1.size() << endl;

结果:

2.capacity:求顺序表容量

string s1("hello");
cout << s1.capacity() << endl;

结果:

3.reserve:用于扩容和缩容

1.扩容:

s1.reserve(100);

假如上述语句是在扩容,那么容量会变成比100要大或者等于100的数。

2.缩容:

s1.reserve(2);

假如上述语句是在缩容,那么容量会不会变小不好说,取决于编译器,但是最起码能够保证的是,它绝对不会因为缩容而影响你原来的数据。

7.增删系列

1.push_back:尾插一个字符

string s1("hello");
s1.push_back('o');
cout << s1 << endl;

结果:

2.append:尾插一个字符串

这里的众多接口与前面讲到的构造类似,所以不再过多赘述。

string s1("hello");
s1.append("xxx");
cout << s1 << endl;

结果:

3.operator+=:拼接字符或字符串

string s1("hello");
s1 += ' ';
s1 += "world";
cout << s1 << endl;

结果:

4.insert:在指定下标插入字符串或字符

1.插入字符串:

string s1("hello");
//在下标为1的位置插入xxx
s1.insert(1, "xxx");
cout << s1 << endl;

结果:

2.插入字符:

string s1("hello");
char ch = 'x';
//在下标为0的位置插入2个ch字符
s1.insert(0, 2, ch);
cout << s1 << endl;
	

结果:

这里的第二个参数不能省略从而变成插入1个字符,可见C++中的string类的设计是有一些冗余的。

5.erase:从指定下标开始删除k个字符

string s1("hello world");
//从指定下标0开始删除1个数据
s1.erase(0, 1);
cout << s1 << endl;

结果:

string s1("hello world");
//若省略第二个参数,则从指定下标6开始删除直到结束
s1.erase(6);
cout << s1 << endl;

结果:

8.replace:替换

string s1("hello world");
//将下标为5起始的4个元素替换
s1.replace(5, 4, "xxx");
cout << s1 << endl;

结果:

9.find:查找(找到指定内容并返回其第一次出现的下标)

string s1("hello world");

//返回找到的下标,如果没找到,则返回npos
int pos = s1.find("hello");
cout << pos << endl;

结果:

string s1("hello world  hello  hello ");

//返回找到的下标(从3下标开始找),如果没找到,则返回npos
int pos = s1.find("hello",3);
cout << pos << endl;

结果:

10.swap:交换函数

swap函数用来交换两个对象的所有成员变量。

string s1("hello xxx");
string s2("hello yyy");
s1.swap(s2);
cout << s1 << endl;
cout << s2 << endl;

结果:

11.c_str:返回string类的指针成员变量(本质是为了兼容C语言)

class string
{
public:
	
private:
	char* arr;
	int size;
	int capacity;
};
string s1("hello xxx");
string s2("hello yyy");
const char* str1 = s1.c_str();

这里的s1.c_str()返回的就是s1.arr

12.substr:从某个下标开始的k个字符构造成一个新的string对象并返回

//例如我想找到一个文件后缀名
string s1("test.cpp");
int pos = s1.rfind('.');
string s2 = s1.substr(pos);
cout << s2 << endl;

结果:

13.find_first_of:从s1中找是否存在我传过去的字符串中的任意一个字符,如果比对成功则返回下标

这个接口作者本人觉得命名不太好,应该改成find_any_of会更容易理解一些

string s1("hello world");
cout<<s1.find_first_of("abcde")<<endl;

结果:

string s1("hello world");
//从下标为3的位置开始找
cout<<s1.find_first_of("abcde",3)<<endl;

结果:

还有一个接口是find_last_of,而这个接口就是将find_first_of换成倒着找而已。说实话这个名字取得也有点矬,应该取名为rfind_any_of会更好一些(作者吐槽)。

14.operator+

string s1("abc");
string s2 = "de" + s1;
cout << s2 << endl;

结果:

15.getline:默认遇到\n才会停止在缓冲区中取数据(cin默认遇到空格和\n就会停止在缓冲区中取数据)

string s1;
//默认遇到\n才会停止取数据
getline(cin, s1);
cout << s1 << endl;

结果:

string s1;
//默认遇到*才会停止取数据
getline(cin, s1,'*');
cout << "——————————————"<<endl;
cout << s1 << endl;

结果:

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

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

相关文章

基于springboot的驾校预约管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的驾校预约管理系统5拥有三种角色&#xff1a;管理员、教练、学员 管理员&#xff1a;学员管理、教练管理、车辆管理、车辆关联、维修管理等 教练&#xff1a;学员查看/毕…

通过Python代码发送量化交易信号邮件通知

量化交易利用数学模型和计算机算法来分析市场数据,并生成交易信号,本文将介绍如何使用Python编写一个简单的脚本,通过发送邮件通知量化交易信号。 开启SMTP服务 首先要在发件箱的邮件设置中,将POP3/SMPT服务开启,记录下授权密码,在本地可通过此密码登录,注意有效期和保…

总结拓展十:SAP开发计划(下)

第一节 接口功能开发说明书设计 1、软件系统接口作用 答&#xff1a;系统接口&#xff0c;是实现系统间数据传输的功能。 2、软件系统接口特点 1&#xff09;采用Web Service技术作为平台&#xff0c;有众多的数据传输协议标准&#xff0c;通过API与外界交流数据。 2&…

向上转移和向下转型

向上转型 实际就是创建一个子类对象&#xff0c;将其当成父类对象来使用。格式&#xff1a;父类类型 对象名new 子类类型&#xff08;&#xff09;&#xff1b;eg&#xff1a;Animal animalnew Cat&#xff08;&#xff09;&#xff1b;animal是父类类型&#xff0c;但可以引用…

超详细超实用!!!零基础java开发之云风笔记接口开发之查询单条笔记详细信息(十二)

云风网 云风笔记 云风知识库 一、service/NoteApi新增getNodeDetail接口定义 public interface NoteApi {...NoteManage getNoteDetail(int id); }二、service/impl/NoteServiceImpl接口实现逻辑 public class NoteServiceImpl implements NoteApi {AutowiredNoteMapper not…

产品经理入门攻略:如何从零开始成为产品经理

“人人都是产品经理”这句话相信你一定听过。 作为现在的热门职业&#xff0c;许多朋友也在心里埋下了一颗想要成为产品经理的种子。 产品经理的工作其实没有传说中的那么“高大上”&#xff0c;甚至可以说大多数时候是枯燥且无聊的&#xff0c;需要不断地对数据进行分析&…

如何在ONLYOFFICE文档中,将新插件添加为选项卡

随着 ONLYOFFICE 文档8.1版本的推出&#xff0c;我们引入了各式各样的功能&#xff0c;旨在增强软件功能性和优化用户体验。其中一项改进是&#xff0c;插件可以显示在一个独立的选项卡中了。在本博客文章中&#xff0c;我们将带您了解充分利用这一新功能的各项步骤。 关于 ONL…

图像修复(Inpainting)技术的前沿模型与数据集资源汇总

图像修复&#xff08;Image Inpainting&#xff09;是一种计算机视觉技术&#xff0c;旨在填补图像中的缺失区域或去除图像中的不需要部分&#xff0c;使其看起来自然且无明显痕迹。其目标是根据图像的上下文信息和周围像素来推断和重建缺失区域的内容&#xff0c;以生成逼真且…

实战17-NavBar+Vip布局

NavBar.ets import { PADDING } from ../../constants/size import rvp from ../../utils/resposive/rvIndexComponent export default struct NavBar {StorageProp(topHeight) topHeight: number 0;build() {Row() {Row({ space: rvp(6) }) {Text(请选择地址).fontSize(rvp(1…

Java基础笔记1】Java基础语法

目录 一、Java简介 二、JDK和Java初体验 三、配置环境变量 四、IDEA快捷键 五、Java语法基础 1. 注释 2. 字面量 3. 变量 4. 关键字和标识符 5. 变量详解 a. 数值数据在计算机中的存储​编辑 b. 文本、图片、音频等数据在计算机中的存储 c. 八进制和十六进制 6. 数据类型 a. …

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上&#xff0c;加上事件结构&#xff0c;实现单击一次按…

【读书笔记-《30天自制操作系统》-22】Day23

本篇内容比较简单&#xff0c;集中于显示问题。首先编写了应用程序使用的api_malloc&#xff0c;然后实现了在窗口中画点与画线的API与应用程序。有了窗口显示&#xff0c;还要实现关闭窗口的功能&#xff0c;于是在键盘输入API的基础上实现了按下按键关闭窗口。最后发现用上文…

初学者笔记本电脑玩转大模型系列二:微调谷歌Gemma模型

之前分享了《初学者笔记本电脑玩转大模型系列一&#xff1a;利用ollama跑大模型》&#xff0c;这不&#xff0c;Google发布了Gemma开放模型&#xff0c;同等参数尺寸性能最好的大模型&#xff0c;那么言归正传&#xff0c;如何在笔记本电脑微调Gemma模型呢&#xff1f;我们接下…

阿里云CTO:通义稳居全球最强开源大模型,性能接近GPT-4o

来源&#xff1a;首席数智官 9月19日&#xff0c;在2024杭州云栖大会上&#xff0c;阿里云CTO周靖人表示&#xff0c;阿里云正在围绕AI时代&#xff0c;树立一个AI基础设施的新标准&#xff0c;全面升级从服务器到计算、存储、网络、数据处理、模型训练和推理平台的技术架构体…

Temu应用全球下载量突破7.35亿次!美国占27%,还是主要市场

据了解&#xff0c;随着购物者更多选择Temu作为实惠的在线购物目的地&#xff0c;其月访问量在今年第一季度跃升至5亿次以上&#xff0c;应用下载量也大幅增加。据外媒报道&#xff0c;根据Stocklytics的最新数据&#xff0c;Temu应用程序截至目前的下载量已超过7.35亿次。 最新…

动态线程池(二)

动态线程池 环境搭建 启动Nacos和redis 安装Node-Exporter 安装Prometheus 安装Grafana 源码解析

鸢尾花书实践和知识记录[数学要素3-2乘除]

书的作者 文章目录 算术乘除&#xff1a;先乘除&#xff0c;后加减&#xff0c;括号内先算基本的乘法运算计算阶乘基本除法 向量的乘法&#xff1a;标量乘法&#xff0c;向量内积&#xff0c;逐项积标量乘法向量的内积对于inner和dot的实现方式的探究逐项积dot的计算过程 逐项…

MAC如何获取文件数字签名和进程名称

1、安装需要查看数字签名和进程名称的软件包 2、打开终端命令行(Terminal) 3、查找数字签名 在终端命令行中输入: codesign -dvv 安装的软件路径 2>&1 | grep "Authority=" | head -n 1 | cut -d = -f2”

PDF使用虚拟列表技术做渲染和加载带来的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

JavaFX实现视频播放功能

一、前言 最近使用javaFx写了个简单的视频播放功能&#xff0c;可以实现打开本地视频播放。 二、实现 1.使用jdk8自带的javaFx包实现&#xff0c;首先定义一个类VideoPlayer。 代码如下&#xff1a; import javafx.application.Application; import javafx.application.Platf…