认识string(一)详解

news2024/9/20 7:52:31

目录

  • 标准库中的string类
    • 了解如何看文档
    • Construct string (构造string)
      • string()空字符串构造函数(默认构造函数)
      • string (const string& str) 拷贝构造函数
      • string (const string& str, size_t pos, size_t len = npos)
      • string (const char* s)复制构造
      • string (const char* s, size_t n)
      • string (size_t n, char c)
      • 补充
    • 遍历string
      • 方式一size与operator[ ]
      • 方式二迭代器iterator
      • 方式三范围for(底层就是迭代器)

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录

标准库中的string类

了解如何看文档

string文档(这个文档广告有点多)
建议在看这个文档的时候用旧版本去看,因为旧版本支持搜索,想要进去旧版本就点击红色方框这个位置
在这里插入图片描述
如果英语不好的可以点击翻译当前页面,但是有时候翻译会有一点问题,比如我们搜索printf函数,然后翻译当前页面后,就会出现下面这种情况,参数的说明符被翻译了
在这里插入图片描述
而没有被翻译时是这样的
在这里插入图片描述
所以最好是用英语去看

C++的STL的容器是在reference的containers中
在这里插入图片描述
在这里插入图片描述
string则是在reference的miscellaneous headers,如果sting实在是不想找也可以通过搜索去查找
在这里插入图片描述
在这里插入图片描述
我们点击Class instantiations的string看看
在这里插入图片描述
这个页面中
Member types是指成员类型

Member functions是指成员函数,也就是前面类和对象所指的六个默认成员函数,因为六个当中有两个不是很重要,所以这部分只有四个,而因为构造和拷贝构造都是构造,所以将他们归纳在一起

Iterators是迭代器,后面会讲

Capacity是容量,这个听起来很抽象,容量不知道是什么东西,举个例子,数据结构中会涉及到扩容等功能,容量其实表示的就是他的内存,因为string是个字符顺序表,所以会出现扩容

Element access翻译是元素访问,这个就有点类似数组访问他的元素

Modifiers翻译是修饰语,其中operator+=是我们比较熟悉的
在这里插入图片描述
他给的例子是这样的,可能就是用string修饰name和family,然后用+=的方式在后面加字符串
在这里插入图片描述
String operations翻译是字符串操作,看了一下他这个部分的函数,可能就是对字符串进行拷贝,还有查找字符串中的某个字符…这些操作

Member constants的翻译是成员常量,这个部分只有一个npos,这个npos是静态常量,他的大小为-1

Non-member function overloads翻译是非成员函数重载,其中有几个是在之前文章中有实现过的,所以应该比较好理解
在这里插入图片描述
当我们在使用某一个函数不知道要包含哪个头文件的时候,我们可以从这里看

在这里插入图片描述

Construct string (构造string)

string()空字符串构造函数(默认构造函数)

英文解释:Constructs an empty string, with a length of zero characters.
翻译:构造一个长度为零个字符的空字符串。

int main()
{
	string s1;
	return 0;
}

在这里插入图片描述

string (const string& str) 拷贝构造函数

英文解释:Constructs a copy of str.
翻译:拷贝构造str

int main()
{
	string s2("jack john");
	string s3(s2);
	cout << s3 << endl;
	return 0;
}

在这里插入图片描述

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

英文解释:Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is string::npos).
翻译:复制str中从字符位置pos开始并跨越len个字符的部分(如果str太短或len为string::npos,则复制到str的末尾)

这个函数的意思是从string中的pos位置开始取len个长度去构造出str

而npos就是上面提到的静态成员常量,他的值是-1

用图表示就像下面这样

在这里插入图片描述
当len的长度超过pos位置到结束的最大长度后,就是有多少取多少
在这里插入图片描述
而如果len的值没有传,或者传的值为npos,那么就从pos位置开始一直取到末尾结束

在这里插入图片描述
为什么len=npos就是取末尾结束呢?
其实我们注意看len的类型是size_t,而npos的值为-1,在之前的文章中有提到过size_t是无符号整数,他是没有负数的,当无符号整数len为-1时,其实表示的是len为无符号整数的最大值,既然是最大值,那应该是已经超过了从pos位置开始到结束的长度,所以就直接取到从pos位置到末尾的长度

而不传len的参数为什么也是取到末尾结束呢?
这是因为len=npos是缺省参数,len不传值的时候就默认传npos

 int main()
{
	string s2("jack john");
	string s4(s2, 5, 3);
	string s5(s2, 5, 10);
	cout << s4 << endl;
	cout << s5 << endl;
	return 0;
}

在这里插入图片描述

string (const char* s)复制构造

英文解释:Copies the null-terminated character sequence (C-string) pointed by s
翻译:复制s指向的以null结尾的字符序列(C字符串)
简单的来说就是string去复制构造一个字符串

int main()
{
	string s6("jack");
	cout << s6 << endl;
	return 0;
}

在这里插入图片描述

string (const char* s, size_t n)

英文解释:Copies the first n characters from the array of characters pointed by s
翻译:从s指向的字符数组中复制前n个字符。

int main()
{
	string s6("jack");
	string s7(s6, 0);
	string s8(s6, 1);
	string s9(s6, 2);
	string s10(s6, 3);
	string s11(s6, 4);
	cout << "s7 " << s7 << endl;
	cout << "s8 " << s8 << endl;
	cout << "s9 " << s9 << endl;
	cout << "s10 " << s10 << endl;
	cout << "s11 " << s11 << endl;
	return 0;
}

在这里插入图片描述
根据什么的结果可以得出,n为0表示从前0个开始复制,n为1表示前1个开始复制…

string (size_t n, char c)

英语解释:Fills the string with n consecutive copies of character c
翻译:用字符c的n个连续副本填充字符串

int main()
{
	string s12(10, 'x');
	cout << s12 << endl;
	return 0;
}

在这里插入图片描述

补充

上面代码中可以直接用<<是因为这个功能已经实现了运算符重载
在这里插入图片描述
我们甚至还可以这样写
在这里插入图片描述

遍历string

方式一size与operator[ ]

因为string是一个类,我们并不能拿到这个字符数组的指针…(私有限制了我们不能去访问),所以要想获取这个字符串的长度,就可以用size,这个size是已经实现了的,我们可以直接用,他的功能就是得到这个字符串中字符的长度

在这里插入图片描述
此外还有运算符重载operator[ ]我们也可以直接用,这个operator[]是让我们可以像数组一样去用s1

在这里插入图片描述

int main()
{
	string s1("jack john");
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < s1.size(); i++)
	{
		s1[i]++;
		cout << (s1[i]) << " ";
	}
	return 0;
}

在这里插入图片描述

由上面的结果可以看出通过s1[i]++我们可以修改s1的字符,并且遍历s1,我们也可以加const去修饰,让s1不可以被修改
在这里插入图片描述

方式二迭代器iterator

先看看下面模拟实现的string

class string
{
public:
	char& operator[](size_t pos)
	{
		return _str[pos];
	}
private:
	char* _str;
	size_t _size;
	size_t _capacity;
};

在这里插入图片描述
str是字符串中的首元素位置,c++为了和c语言兼容所以在这个字符串中会有\0,size是计算这个的长度,但是\0是不会被计算到size里的,所以size的大小为8
在这里插入图片描述
知道了这些现在来讲解一下具体是如何遍历的
我们需要用到string中的iterator,iterator是一个迭代器,这个迭代器是定义在string的类域里面的,所以在用的时候我们要用域作用限定符
在这里插入图片描述

int main()
{
	string s1("jackjohn");
	string::iterator it1 = s1.begin();
	while (it1 != s1.end())
	{
		cout << *it1 << " ";
		++it1;
	}
	return 0;
}

在这里插入图片描述
迭代器用起来像指针一样(不是指针),begin像首元素的地址,end就是\0的地址,当begin=end的时候就结束了

又因为string中有\0,但是\0不是有效字符,所以end表示为最后一个有效字符的下一个位置,而begin表示为第一个有效字符,因此从这句话我们可以推断出字符的有效范围是[begin,end)
这里也顺便提一下,之前文章C++入门基础(四)中的auto也解释过,auto在复杂情况下要少用
在这里插入图片描述
上面的iterator为正向迭代器,有正向当然也有反向

int main()
{
	string s1("jackjohn");
	string::reverse_iterator it1 = s1.rbegin();
	while (it1 != s1.rend())
	{
		cout << *it1 << " ";
		++it1;
	}
	return 0;
}

在这里插入图片描述

此外iterator是可以修改字符的

int main()
{
	string s1("jackjohn");
	string::iterator it1 = s1.begin();
	while (it1 != s1.end())
	{
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;
	it1 = s1.begin();
	while (it1 != s1.end())
	{
		*it1=*it1+2;
		cout << *it1 << " ";
		++it1;
	}
	return 0;
}

在这里插入图片描述

方式三范围for(底层就是迭代器)

范围for是可以遍历容器的,因为范围for的底层就是迭代器

int main()
{
	string s1("jackjohn");
	for (auto e : s1)
	{
		cout << e;
}
	cout << endl;
	return 0;
}

在这里插入图片描述

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

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

相关文章

FiddlerScript Rules修改-更改发包中的cookie

直接在fiddler script editor中增加如下处理代码即可 推荐文档oSession -- 参数说明 测试笔记 看云

SSRF漏洞深入利用与防御方案绕过技巧

文章目录 前言SSRF基础利用1.1 http://内网资源访问1.2 file:///读取内网文件1.3 dict://探测内网端口 SSRF进阶利用2.1 Gopher协议Post请求2.2 Gopher协议文件上传2.3 GopherRedis->RCE2.4 JavaWeb中的适用性&#xff1f; SSRF防御绕过3.1 Url黑名单检测的绕过3.2 Url白名单…

公共安全和应急管理系统:提升社区韧性与危机应对能力

引言 公共安全和应急管理是现代社会不可或缺的组成部分&#xff0c;其核心目标是确保社会的稳定和居民的福祉。随着全球化、城市化和技术进步&#xff0c;社会面临的风险和威胁日益复杂多样&#xff0c;从自然灾害到人为事故&#xff0c;从公共卫生危机到恐怖袭击&#xff0c;公…

机器学习(V)--无监督学习(三)EM算法

EM算法 极大似然估计 极大似然估计&#xff1a;(maximum likelihood estimate, MLE) 是一种常用的模型参数估计方法。它假设观测样本出现的概率最大&#xff0c;也即样本联合概率&#xff08;也称似然函数&#xff09;取得最大值。 为求解方便&#xff0c;对样本联合概率取对…

强烈推荐!!李沐老师《动手学深度学习》最新Pytorch版!

动手学深度学习(PyTorch版)》是由李沐、Aston Zhang和孔德威共同编写的教材&#xff0c;专为深度学习初学者和实践者设计。本书使用PyTorch作为主要的深度学习框架&#xff0c;全面系统地介绍了深度学习的基本理论、常见模型和实际应用技巧。 书中内容包括深度学习的基础知识、…

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)

上一篇圆形表盘指针式仪表的项目受到很多人的关注&#xff0c;咱们一鼓作气&#xff0c;把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数&#xff0c;并将读数结果进行输出&#xff0c;若需要完整数据集和源代码可以私信。 目录 &…

Html5+Css3学习笔记

Html5 CSS3 一、概念 1.什么是html5 html: Hyper Text Markup Language ( 超文本标记语言) 文本&#xff1a;记事本 超文本&#xff1a; 文字、图片、音频、视频、动画等等&#xff08;网页&#xff09; html语言经过浏览器的编译显示成超文本 开发者使用5种浏览器&#xf…

element ui ts table重置排序

#日常# 今天带的实习生&#xff0c;在遇到开发过程中&#xff0c;遇到了element ui table 每次查询的时候都需要重置排序方式&#xff0c;而且多个排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

谷粒商城实战笔记-24-分布式组件-SpringCloud Alibaba-Nacos配置中心-命名空间与配置分组

文章目录 一&#xff0c;命名空间1&#xff0c;简介1.1&#xff0c;命名空间的主要功能和特点1.2&#xff0c;使用场景1.3&#xff0c;如何指定命名空间 2&#xff0c;命名空间实战2.1&#xff0c;环境隔离2.2&#xff0c;服务隔离 二&#xff0c;配置集三&#xff0c;配置集ID…

半月内笔者暂不写时评文

今晨&#xff0c;笔者在刚恢复的《新浪微博》发布消息表态如下&#xff1a;“要开会了&#xff01;今起&#xff0c;半月内笔者暂不写敏感时评文&#xff0c;不让自媒体网管感到压力&#xff0c;也是张驰有度、识时务者为俊杰之正常选择。野钓去也。” 截图&#xff1a;来源笔者…

apple watch程序出错 Cannot launch apps while in nightstand mode

开发的时候运行apple watch程序出错&#xff1a; ailure Reason: The request was denied by service delegate (IOSSHLMainWorkspace) for reason: Busy ("Cannot launch apps while in nightstand mode"). 这是因为&#xff1a; 将Apple Watch放在充电器上并直立…

4款免费国产开源软件,功能过于强大,常被认为是外国人开发

之前小编分享了一些良心的电脑软件&#xff0c;大部分都是国外的开源软件&#xff0c;就有部分同学在后台说小编有点极端了&#xff0c;国内也是有良心的电脑软件的。 本期就是国产软件专场&#xff0c;今天就给大家推荐几款良心的国产电脑软件&#xff0c;说真的&#xff0c;…

“离职员工”试图打包资料带走,如何防止敏感数据外泄?

2010年5月间&#xff0c;某家电巨头四名前职工非法泄露该家电洗衣机重要生产和采购环节数据&#xff0c;给家电集团造成直接经济损失共计2952.35万元。 2017年1月&#xff0c;某科技巨头消费者终端业务6名员工&#xff0c;离职后拿着该企业终端的知识产权结果赚钱&#xff0c;最…

fork的理解

一. 注意点 1.进程是并发的&#xff0c;主进程和子进程同时进行&#xff0c;效率高2.子进程产生时是完全复制主进程的状态的&#xff0c;只有在产生修改的时候才会单独分配资源。 二. 下面程序一共应该为8个进程&#xff0c;但code的终端看到只有7个进程号的原因。因为fork返…

线程与进程的区别和联系

前言 在上篇文章里&#xff0c;我们知道了进程管理的一些相关知识-->http://t.csdnimg.cn/OVGAD&#xff0c;但是在实际编写代码的过程中&#xff0c;我们都是用一个CPU在工作&#xff0c;无法体现多核的优势&#xff0c;这次咱们在细分一下了解线程~ 什么是线程(Thread)&am…

three-tile: 1. 第一个three-tile程序

上篇介绍了&#xff1a;three-tile&#xff1a; 一个开源的轻量级三维瓦片库-CSDN博客 three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 项目地址&…

自建邮局服务器相比云邮箱有哪些优势特性?

自建邮局服务器如何配置&#xff1f;搭建自建邮局服务器的技术&#xff1f; 尽管云邮箱服务提供了便捷和低成本的解决方案&#xff0c;自建邮局服务器依然具有许多独特的优势和特性&#xff0c;吸引了众多企业和组织。AokSend将深入探讨自建邮局服务器相比云邮箱的主要优势。 …

如何指定多块GPU卡进行训练-数据并行

训练代码&#xff1a; train.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import torch.nn.functional as F# 假设我们有一个简单的文本数据集 class TextDataset(Dataset):def __init__(self, te…

本地部署私人知识库的大模型!Llama 3 + RAG!

在今天的的教程中&#xff0c;我们将打造更加个性化的大模型&#xff0c;可以定制搭载私人知识库的本地大模型&#xff01; 我们探讨Meta AI 的尖端 Llama 3 语言模型构建强大的检索增强生成 &#xff08;RAG&#xff09; 来实现。通过利用 Llama 3 和 RAG 技术的功能&#xf…

雨季的文物保护

随着夏季的到来&#xff0c;高温和多雨给文物保护带来了新的挑战。在这个季节&#xff0c;文物不仅面临着物理和化学损害的风险&#xff0c;还可能因为管理不善而遭受人为破坏。因此&#xff0c;探讨如何在夏季炎热天气中做好文物保护工作&#xff0c;对于维护文化遗产的完整性…