【C++进阶之路】手把手教你使用string类的接口

news2024/11/20 13:44:51

文章目录

  • 前言
    • 基本认识
    • 基本使用
  • 一.构造函数
    • 默认构造函数
    • 拷贝构造函数
    • 其它构造函数
      • ①string(const char* s)
      • ②string(size_t n, char c)
      • ③string (const string& str, size_t pos, size_t len = npos)
  • 二.容量接口
    • ①size与length
    • ②max_size
    • ③capacity
    • ④empty
    • ⑤clear
    • ⑥reverse
    • ⑦resize
  • 三.修改接口
    • ①+=
    • ②[]
    • ③push_back
    • ④append
    • ⑤c_str
    • ⑥ find
    • ⑦rfind
  • 四.迭代器——iterator
    • 基本概念
    • ①begin与end
    • ②rbegin和rend

前言

在C语言中是没有字符串类型的,但是我们会经常对字符串进行操作,因此到了C++就提出了string类,用于对字符串进行操作,下面我们来了解一下。

基本认识

  • 字符串是表示字符序列
  • 因为string类实现的比STL早,所以不在容器里。
  • string类的使用跟容器,都基本是通过调用接口实现的。
  • string类是basic_string模板的实例化,操作的数据类型为char

string在底层实际是:basic_string模板类的别名——
typedef basic_string<char, char_traits, allocator>string;

  • string类只能操作单个字符,不能对多个字符一块操作。

基本使用

库里面的类——那就要包含头文件

#include<string>

要使用库里的类:

  1. 展开命名空间
using namespace::std;
  1. 或者指定作用域
std::string A;

一.构造函数

默认构造函数

函数:

string()

功能:初始化为空字符串,后面跟上一定长度的0或者说为\0

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A;
	return 0;
}

打开监视窗口,看初始化后的结果:
在这里插入图片描述

  • 给我们显示的只是一个空字符串。
  • 那实际上呢?
    在这里插入图片描述
  • 其实是一个数组,空间是16个字节,前4个元素初始化为0——\0

拷贝构造函数

函数:

string(const string&s)
//这里的const将权限缩到最小,所以既可以传string又可以传const string

功能:拷贝构造。
举例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A;
	string B(A);
	string C = A;
	//这里也是拷贝构造,因为是用一个已经初始化的对象初始化另一个正在初始化的对象。
	return 0;
}

其它构造函数

①string(const char* s)

函数:

string(const char* s) 

功能:用一个字符串初始化一个string类。

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string B("hello world");
	return 0;
}

②string(size_t n, char c)

函数:

string(size_t n, char c)

功能:将string类初始化为n个c字符。

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string B(6,'x');
	cout << B << endl;
	return 0;
}

执行结果:
在这里插入图片描述

③string (const string& str, size_t pos, size_t len = npos)

函数:

string (const string& str, size_t pos, size_t len = npos)
static const size_t npos = -1;//-1就等于FFFFFFFF

功能:将一个string类的内容从第pos个位置开始,到npos位置的字符拷贝到另一个string类中。

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string B("hello world");
	string A(B, 0, 5);
	//这里的0按照数组的下标进行计算的。
	//5是包括从0位置开始的5个元素。
	cout << A << endl;
	return 0;
}

二.容量接口

①size与length

  • 说明:size与length都是求string类的有效字符。

有效字符就是求除了\0的字符。

举例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A("hello");
	cout << A.size() << endl;
	cout << A.length() << endl;
	return 0;
}

补充:size的设计是为了迎合容器,因为只有字符串才叫长度,其它的都叫size。

②max_size

函数:

size_t max_size() const;

功能:字符串能够达到的最大长度。
例:

#include <iostream>
#include <string>
int main()
{
	string A;
	cout<<A.max_size()<<endl;
	return 0;
}

在这里插入图片描述

③capacity

  • 功能:求字符类当前有效字符的最大容量。

举例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A("hello");
	cout << A.capacity() << endl;
	return 0;
}

执行结果:
在这里插入图片描述
在这里插入图片描述

  • 可我们明明开了16个字节,但是这里却说开辟了15个字节,为什么呢?

  • 因为:我们并没有算\0的空间,只算了能够存储有效字符的空间

那如果我们这样写呢?

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A("hel\0lo\0");
	cout << A.capacity() << endl;
	return 0;
}

结果:
在这里插入图片描述

识别出来的字符串是这样的:
在这里插入图片描述

  • 因此:string类只识别到第一个\0为止,之后的不做考虑。

那如果我们存20个字节,那么string类会对我们的空间进行扩容吗?

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A("hello");
	int prev_capacity = A.capacity();
	cout << prev_capacity << endl;
	for (int i = 0; i < 4; i++)
	{
 		while (A.size() != prev_capacity)
		{
			A += 'x';
		}
		A += 'x';
		cout << A.capacity() << endl;
		prev_capacity = A.capacity();
	}
	return 0;
}

执行结果:
在这里插入图片描述
我们可以看出——这里是会扩容的,而且第一次扩容是2倍扩容(算上\0),之后的扩容接近1.5倍扩容。(VS2019)
我们再换到Linux平台上进行测试:
在这里插入图片描述

  • 不难看出,这里的扩容是以两倍进行扩容的

④empty

函数:

bool empty() const;
//说明:加了const,所以使用empty是不会对string类进行修改的。

功能:检测string是否为空,为空返回真,其余情况返回假。

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A("\0");
	if (A.empty())
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

结果:
在这里插入图片描述

⑤clear

函数:

void clear();

功能:减少string中的字符,使之成为空字符串,也就是字符串的长度为0。

例:

#include<iostream>
#include<string>
using namespace::std;
int main()
{
	string A("hello world");
	A.clear();
	if (A.empty())
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

结果:
在这里插入图片描述

⑥reverse

函数:

void reserve (size_t n = 0);

功能:为字符串预留n空间,当n大于capacity时进行扩容,其余情况按照原先的capacity。
结果:使string的capacity大于等于原来的capacity。

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	A.reserve(20);
	cout <<A<< endl;
	return 0;
}

执行前:capacity——15
在这里插入图片描述
执行后:capacity——31
在这里插入图片描述

⑦resize

函数:

void resize (size_t n);
void resize (size_t n, char c);
//这两个是函数重载

功能:

  • 当n小于size时,会将多于n的字符全部删除,对于少的则不做处理。
  • 当n大于size时,如果没有第二个参数,会将大于size的部分填充为\0,如果有第二个参数,则会将大于size的部分填充为第二个参数的值。

例1:小于size

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	A.resize(1,'x');//这里的x其实没啥用
	cout << A << endl;
	return 0;
}

结果:
在这里插入图片描述
例2:大于size

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	A.resize(20,'x');
	cout << A << endl;
	return 0;
}

结果:
在这里插入图片描述

三.修改接口

①+=

函数:

string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c);

功能:+=一个字符串/字符/string类

例:

#include <iostream>
#include <string>

int main()
{
	string A;
	A += "hello";
	A += ' ';
	string B("world");
	A += B;
	cout << A << endl;
	return 0;
}

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

②[]

函数:

 char& operator[] (size_t pos);
 const char& operator[] (size_t pos) const;

功能:访问字符串下标位置的字符。
例:

#include <iostream>
#include <string>
int main()
{
	string A("hello");
	char a = A[0];
	cout << a << endl;
	return 0;
}

结果:
在这里插入图片描述

③push_back

函数

void push_back (char c);

功能:再string末尾后追加一个字符
例:

#include <iostream>
#include <string>
int main()
{
	string A("hello");
	A.push_back('x');
	cout << A << endl;
	return 0;
}

结果:
在这里插入图片描述

④append

函数:

string& append (const string& str);

string& append (const string& str, size_t subpos, size_t sublen);

string& append (const char* s);
	
string& append (const char* s, size_t n);

string& append (size_t n, char c);

功能:在指定string后面追加 n个字符/(前n个字符的)字符串/string(从subpos位置到sublen位置)。

例:

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	string B(" hello");
	A.append(B,0,6);
	cout << A << endl;
	A.append(B);
	cout << A << endl;
	A.append(" hello", 0, 6);
	cout << A << endl;
	A.append(6, 'x');
	cout << A << endl;
	return 0;
}

结果:
在这里插入图片描述

⑤c_str

函数:

const char* c_str() const;

功能:返回一个字符串,类型是const char *。
例:

#include <iostream>
#include <string>
int main()
{
	string A("hello");
	const char* a = A.c_str();
	cout << a << endl;
	return 0;
}

结果:
在这里插入图片描述

⑥ find

函数:

size_t find (const string& str, size_t pos = 0) const;
	
size_t find (const char* s, size_t pos = 0) const;

size_t find (const char* s, size_t pos, size_t n) const;

size_t find (char c, size_t pos = 0) const;
//pos是要查找string的下标,n是要在指定字符串中查找的长度。
//size_t,如果成功返回一个匹配成功的下标,如果失败返回-1(转换为无符号整形)。

功能:在string类的指定pos下标位置开始,向后查找目标【string/字符串(指定查找前n个)/字符】——的字符c位置,并返回其位置。
注意:查找的是(字符串,string里面的)字符。
例:

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	string B("world");
	cout << A.find(B, 0)<<endl;
	cout << A.find("world", 0) <<endl;
	cout << A.find("world", 0, 5) <<endl;
	cout << A.find('w', 0) <<endl;
	return 0;
}

结果:
在这里插入图片描述

⑦rfind

函数:


size_t rfind (const string& str, size_t pos = npos) const;

size_t rfind (const char* s, size_t pos = npos) const;

size_t rfind (const char* s, size_t pos, size_t n) const;

size_t rfind (char c, size_t pos = npos) const;
原理:同find

功能:在string类的指定pos下标位置开始,向前查找目标【string/字符串(指定查找前n个)/字符】——的字符c位置,并返回其位置。

例:

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	string B("world");
	cout << A.rfind(B, 5)<<endl;
	cout << A.rfind("world", 10) <<endl;
	cout << A.rfind("world", 10, 5) <<endl;
	cout << A.rfind('w', 10) <<endl;
	return 0;
}

结果:
在这里插入图片描述

四.迭代器——iterator

基本概念

迭代器的作用是用来访问容器(用来保存元素的数据结构)中的元素,所以使用迭代器,我们就可以访问容器中里面的元素。

①begin与end

函数:

      reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

功能:获取string的开头位置。

函数:

 iterator end();
 const_iterator end() const;

功能:获取string最后一个有效字符的位置。

例:

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	string::iterator it = A.begin();
	//当A是const修饰的类时,我们就要用string::const_iterator迭代器
	while (it != A.end())
	{
		cout << *it << " " ;
		it++;
	}
	return 0;
}

结果:
在这里插入图片描述

②rbegin和rend

函数:

      reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

功能:获取最后一个有效字符的位置。
函数:

      reverse_iterator rend();
const_reverse_iterator rend() const;

功能:获取第一个字符的位置。

例:

#include <iostream>
#include <string>
int main()
{
	string A("hello world");
	string::reverse_iterator it = A.rbegin();
	while (it != A.rend())
	{
		cout << *it << " " ;
		it++;
	}
	return 0;
}

说明:这里的rbegin + 1是倒着加1
结果:
在这里插入图片描述
其余内容请看文档

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

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

相关文章

Elastic Learned Sparse Encoder 简介:Elastic 用于语义搜索的 AI 模型

作者&#xff1a;Aris Papadopoulos, Gilad Gal 寻找意义&#xff0c;而不仅仅是文字 我们很高兴地与大家分享&#xff0c;在 8.8 中&#xff0c;Elastic 提供开箱即用的语义搜索。语义搜索旨在根据文本的意图或含义进行搜索&#xff0c;而不是词汇匹配或关键字查询。与传统的…

华为云服务器租用费用及CPU性能(1核2G/2核4G/4核8G)

华为云HECS云服务器即云耀云服务器&#xff0c;类似于阿里云和腾讯云的轻量应用服务器&#xff0c;HECS云服务器1核2G配置39.02元一年、2核4G配置99元一年、4核8G配置69.94元3个月&#xff0c;华为云百科分享华为云HECS云服务器租用费用及CPU性能详解&#xff1a; 目录 华为云…

图解LeetCode链表题

&#x1f490;文章导读 本篇文章主要详细的用图解的方式为大家讲解了简单程度的链表题&#xff0c;如果题中有错误的地方&#xff0c;还麻烦您在评论区指出&#xff0c;你的意见就是我最大的进步&#xff01;&#xff01;&#xff01; &#x1f490;专栏导读 &#x1f934;作者…

什么是数字化?企业为什么要数字化转型

一、什么是数字化&#xff1f; 什么是数字化&#xff1f;在我理解&#xff0c;数字化是一个基于时代科技发展所产生的概念&#xff0c;首先它是一个工具&#xff0c;在企业的经营发展中将信息技术融入到传统的企业模式中&#xff0c;起到了转型的作用。 其次数字化转型是企业…

国产易灵思FPGA的FIFO应用详解

一、软件设置界面 FIFO&#xff08;First In First Out&#xff0c;即先入先出&#xff09;&#xff0c;是一种数据缓冲器&#xff0c;用来实现数据先入先出的读写。与 ROM 或 RAM 的按地址读写方式不同&#xff0c; FIFO 的读写遵循“先进先出”的原则&#xff0c;即数据按顺…

关于this->moveToThread(this)——QtWidgets

前言 官方关于QThread的用法有两种&#xff1a;一是子类QThread&#xff0c;并重新实现run&#xff1b;二是使用QObject::MoveToThread&#xff0c;通过信号槽在不同的线程内通信。 最近看到了一种写法&#xff0c;就是将两者融合就是子类QThread&#xff0c;然后this->mo…

【小程序】封装时间选择组件:用单元格van-cell和插槽slot,包括起始时间和终止时间

效果 可以选择起始时间和终止时间&#xff0c;并显示。 时间选择器放在van-cell的value插槽中。 用的库&#xff1a; https://vant-contrib.gitee.io/vant-weapp/#/home https://dayjs.fenxianglu.cn/category/ 用的组件&#xff1a;Cell单元格、DatetimePicker时间选择、Pop…

【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

书接上回&#xff1a;【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览&#xff1a; 工具目标&#xff1a; 1. 实现将psd解析生成为UI预制体&#xff0c;并导出UI图片。需支持UGUI和TextMeshProGUI, 如Button、To…

文心一言 VS 讯飞星火 VS chatgpt (22)-- 算法导论4.2 2题

二、为Strassen算法编写伪代码。 文心一言&#xff1a; Strassen算法是一种用于矩阵乘法的算法&#xff0c;它的核心思想是通过不断将原始矩阵分割成较小的子矩阵来实现高效的乘法运算。以下是Strassen算法的伪代码&#xff1a; function Strassen(A, B): if A[0][0] 0 or…

优化|数学软件是如何求解线性方程Ax=b ?

编者按 对于大家来说&#xff0c;我们从学会多项式开始就得和求解矩阵方程打交道。大学之前靠手算&#xff0c;到了大学阶段我们学会了使用科学计算软件&#xff0c;然后只需要输入简单的一行指令 x A \ b x A \backslash b xA\b&#xff0c;就可以轻轻松松求解方程组 A x …

html实现酷炫科技风大屏风格模板(附源码)

文章目录 1.设计来源1.1 大屏主界面1.2 弹框界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130870963 html实现酷炫科技风大屏风格模板源码 &#xff0c;html大屏源码…

docker容器postgres数据导出命令及还原数据命令

参考资料 docker控制postgers容器导入导出数据_docker 导出数据库_奔跑的痕迹的博客-CSDN博客 --进入容器 docker exec -it 容器名称或容器id /bin/bash 以下命令是在进入容器执行的 --导出单张表的备份语句&#xff08;copy模式&#xff09; pg_dump -h 127.0.0.1 -U …

授权管理再工控安全中起到什么作用?

随着计算机技术、通信技术和控制技术的发展&#xff0c;工业自动化控制已经开始向网络化方向发展&#xff0c;从最初的CCS&#xff08;计算机集中控制系统&#xff09;&#xff0c;到第二代的DCS&#xff08;分散控制系统&#xff09;&#xff0c;发展到现在流行的FCS&#xff…

力扣 1775.通过最少操作次数使数的和相等、1014.最佳观光组合、33.搜索旋转排序数组

算法总结 最近作者在坚持每日一道中等难度算法题&#xff0c;也是作者考核时经常会碰到的难度&#xff0c;由于经常是到22:30才意识到自己并没有写算法&#xff0c;因此都是打开LeetCode网站随机一题&#xff0c;并未系统性的去学习&#xff0c;这一点值得反思。在做题过程中经…

航天科技AIRIOT物联会【智慧物联主题沙龙】在沈阳举办

2023年5月24日&#xff0c;由航天科技控股集团股份有限公司&#xff08;简称“航天科技”&#xff09;智慧物联事业部主办的《AIRIOT物联会-智慧物联主题分享沙龙》在沈阳举办&#xff0c;此次会议邀请到来自光伏、燃气、能源、水务、园区、工厂等行业的众多企业代表参加&#…

0起步用GPT+知乎赚了点小钱,人人可复制

大家好&#xff0c;我是五竹。 前段时间分享了一篇关于用ChatGPT赚点小钱的实战&#xff1a;TMD&#xff0c;被人偷窥了一个月&#xff01;结果上周末的时候在知乎追了一个关于Claude的热点&#xff0c;发布了一篇注册Claude的文章&#xff0c;结果小小的“爆了”一下&#xf…

Qt文件系统源码分析—第五篇QTemporaryFile

深度 本文主要分析Windows平台&#xff0c;Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次&#xff0c;再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

如何查看一个 docker 镜像有哪些版本

如何查看一个 docker 镜像有哪些版本 因为通过 docker search 并不能查看某个镜像的版本信息&#xff0c;如我需要特定版本的 redis 那怎么办呢~ 本文提供了如下几种方式&#xff0c;大家可以分别逐个尝试下~ 为什么有几种方式呢&#xff0c;因为官方的查找镜像网址 Docker H…

使用audition测试USBaudio数据回传延时

一&#xff0c;简介 本文主要介绍如何使用Audition软件来测试STM32 USB audio上行音频数据的延时。 二&#xff0c;准备工作 Audition&#xff0c;ASIO驱动&#xff0c;STM32枚举的USB Audio高速声卡测试板。 二&#xff0c;硬件连接 将STM32的IIS的data in和data out使用…

四款AI视频翻译产品横评

本文内容节选自 Paxi.ai 的文章分享&#xff0c;从其中摘录了我觉得有意思的一部分。Paxi.ai 是一个基于 GPT-4 打造的帮用户快速使用AI的AI工具&#xff0c;通过与它的小助手对话可以了解各种AI的产品功能和使用方式。对本文内容感兴趣的朋友可以上他们官网查看。 有没有想过把…