波奇学STL:String入门和迭代器

news2024/7/4 6:14:06

目录

​编辑

Constructor/Destructor/Operator=

Constructor:构造函数

Iterator:迭代器

begin()/end():迭代器像指针一样访问问函数

个人对迭代器的理解

rbegin()/rend():迭代器反向移动

除了用迭代器访问元素外string类还可以[]+下标

Capacity:容量?

s.size()/s.length:求字符串

s.reserve()非强制指令修改容量大小

s.resize(n,ch)修改字符串内容到n个长度,用ch字符填补新增的长度

Element access:获取元素

Modifiers:修改

 +=:添加字符或字符串到原来的字符

assign是覆盖字符串和replace大同小异

insert:选择地方插入字符串

erase:消除指定位置字符串

 String operations

find寻找字符串的对于字符或者字符串返回第一个位置,如果没找到返回npos常数

rfind:从后往前找,和find的方向相反。

find_first_of:找出字符串的所有指定字符

Member constans:常数

Non-member function overloads:非成员函数

getline:读取有空格的字符串

 

Constructor/Destructor/Operator=

Constructor:构造函数

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;//空字符串
	string s4("abcde");//"abcde"
	string s5("abcde",3);//"abc" 截取前n个
	string s2(s1);//空字符串 //拷贝构造
	string s3(s4, 0, 2);//'ab' //截取s4的[0,2),不包括2
	string s6(6, 'a');//'aaaaaa'
    return 0;
}

Iterator:迭代器

begin()/end():迭代器像指针一样访问问函数

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

有点懵对吗?先看看第一句代码

string::iterator it=s1.begin();
//定义了变量it,调用s1的实例方法begin的返回值赋值给it
//it的类型是 string::iterator表明it的类型是string的迭代器

所有s1.begin()和s1.end()表示什么意思?

图解 

s1.begin()可以看成第一个元素的地址,s1.end()可以看成最后一个有效元素('o')的下个元素的地址('/0');

由此我们明白了代码的意思,从第一个的元素开始访问,一直到'/0'停止。

观察代码我们发现迭代器的用法和地址很像,上面也说了可以看成指针,所有迭代器是指针吗?

迭代器不完全是指针

某些类的迭代器底层是指针,如string,但是有些类的迭代器底层并不是指针,但在理解上可以看成指针。

个人对迭代器的理解

在C时我们用数据类型(int ,char等)去描述一个对象,但是这是一种机器的角度去看待事物,随着发展,人们提出用类和对象去描述一个对象,如果类对标的是数据类型,那么迭代器对标的就是指针,所以迭代器是类指针(如果真的有这个名字,笑),准确说是stl的类

rbegin()/rend():迭代器反向移动

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

图解

除了用迭代器访问元素外string类还可以[]+下标

string s1="hello";
s1[0]//'h'
s1[1]//'e'
s1[2]//'l'

两种方式的比较

两种访问方式的比较

[]+下标比较简洁,但是只能在链状结构上使用,比如数组,string(如果是树的话,就不能用这种方式了。)

迭代器可以用于所有的容器(就是数据结构,如树,图等等),迭代器可以和算法配合。

Capacity:容量?

有点懵?我们可以把类的成员变量简化为右边三个 

 _s 表示字符串, _size表示字符串大小, _capacity表示空间的容量,如果字符串大于空间大小就系统就会扩容。

s.size()/s.length:求字符串

string s("hello world");
//s.size()/s.length()返回字符串长度不包括'\0'
s.size() //11
s.length() //11
s.max_size()//字符串的最大长度
s.capacity()//字符串开辟的空间
s.clear()//清空字符串内容

s.max_size()并没有太大意义,不同版本的编译下值不同,不同编译器的s.capacity()变化方式也不同

s.reserve()非强制指令修改容量大小

s.resever(100)//capacity:15->100 or greater

不一定等于100是因为编译器的对齐原则可能大于100

非强制体现在字符串非空时不会缩小空间,clear()后就会

s.reserve(1)//capacity:15->15,非空字符串

s.clear()
s.reserve(1)//capacity:15->1

s.resize(n,ch)修改字符串内容到n个长度,用ch字符填补新增的长度

string s("hello world");
s.resize(s.size()+1,'!');// hello word!

*n是长度,不是空间,不算'/0',如果n小于s.size()就会只取前n个字符。

s.shrink_to_fit()是收缩空间。

Element access:获取元素

operator[]上文已经提到了,s.at()用法和operator[]一样

s.at(0)//h
s[0]//h
s.back();// d
s.front();// h

*s.back()是字符串的长度的最后一个,不算'\0'

Modifiers:修改

 +=:添加字符或字符串到原来的字符

string s("hello world");
s+='!';//"hello world!"

+=和append,push_back大同小异,append稍微特殊的用法可以截取一段字符的一部分添加

string s1("bye");
s.append(s1,0,1);//"hello worldb"

注意截取的片段是[0,1)的关系。

assign是覆盖字符串和replace大同小异

string s("hello world");
string s1("bye");
s.assign(s1, 0, 1);//s:b

insert:选择地方插入字符串

string s("hello world");
string s1("bye");
s.insert(0,s1);
cout << s << endl;//byehello world
	

在0的位置的插入字符串

erase:消除指定位置字符串

string s("hello world")
s.erase(0,1);
cout << s << endl;//ello world

 String operations

find寻找字符串的对于字符或者字符串返回第一个位置,如果没找到返回npos常数

string s("hello world");
cout << s.find('h') << endl;
// 0

rfind:从后往前找,和find的方向相反。

find_first_of:找出字符串的所有指定字符

string s("hello world");
cout << s.find_first_of("helo") << endl;
//0 第一个字符h就在"helo"

寻找在字符串"helo"的任何一个字符,并返回位置

find_last_of:从后向前找

Member constans:常数

string s("hello world");
size_t a = -1;
s.npos == a //true

s.npos表示size_t的最大值,常常会出现在返回值或者参数时,如find没找到字符串会返回npos和a的值是相同的。

Non-member function overloads:非成员函数

 operator+/operator>>/operator<<在前面的章节函数重载时提过,因为顺序的原因所以一个是不能重载的。

getline:读取有空格的字符串

string s;
string s1;
cin>>s1;//"h d"
getline(cin, s);//"h d"
cout << s;//"h d"
cout << s1;//'h'

cin不能读取空格,getline可以

最后:学STL还是要学看官方文档,此文只是为有个大体的印象。

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

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

相关文章

Hystrix入门使用 服务熔断 服务降级 服务雪崩

一、概念 hystrix停止更新&#xff0c;理念优秀。 分布式系统面临的问题: 对于复杂的分布式体系&#xff0c;有数十个依赖&#xff0c;依赖不可避免的错误。 服务会出现雪崩&#xff0c;高可用受到破坏。 Hystrix就是用于解决分布式系统延迟和容错的开源库。 保证在一个依赖出…

Python五彩气球

文章目录 前言Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字 五彩气球气球类漂浮函数气球函数六一祝福 尾声 前言 六一要来啦&#xff0c;快来领取博主精心准备的五彩气球吧&#xff01; Turtle基础 小海龟(Turtle)是Python中画图的一…

SpringBatch历史数据的清理方案及实现

SpringBatch历史数据的清理方案及实现 需求背景 SpringBatch的程序已经运行了将近一年&#xff0c;数据量已经达到了一定的数据量级别。 对SpringBatch历史数据的清理也被提上日程。 但是SpringBatch的代码中似乎没有找到清理历史数据的代码&#xff0c;在官方文档中也没有…

一、STM32程序下载软件_FlyMCU

1、软件简介 (1)FlyMCU是一款STM32下载程序的软件。 (2)FlyMCU采用ISP下载方式。 (3)ISP&#xff1a;在线系统编程。 (4)FlyMCU支持STM32F1、STM32F2、STM32F4系列&#xff0c;其他暂不支持&#xff0c;后续应该也不会更新了。 (5)STM32芯片的ISP下载&#xff0c;只能使用…

LINUX系统编程-----中

文章目录 进程间的通信管道popen 和 pclosepipeFIFO 共享内存system V 版本的共享内存创建/获取共享内存 共享内存涉及的函数共享内存的通信两个进程同时对共享内存进行读写 信号量使用信号量保护共享资源消息队列死锁 信号内核不可中断状态 进程间的通信 管道 在操作系统中&…

【备战秋招】每日一题:4月1日美团春招(二批)第三题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

Electron简单开发

文章目录 1.参考网站2.HelloWold编写2.1新建空文件夹2.2node初始化2.3安装electron依赖2.4添加.gitignore 文件2.5创建main.js文件和index.html2.6运行electron应用 3.打包 接到一个任务&#xff0c;将electron集成到solidworks中&#xff0c;所以记录一下electron的简单操作&a…

【操作系统】05.文件管理

文件管理 文件的属性 文件内部数据的组织 文件之间的组织 操作系统向上层提供功能 创建文件 删除文件 打开文件 关闭文件 读文件 写文件 文件的逻辑结构 无结构文件 有结构文件 顺序文件 文件的物理结构 磁盘块&#xff08;文件块&#xff09; 连续分配 优点 对于机…

操作系统 四、文件管理

文章目录 4.1 文件的逻辑结构4.2 文件目录4.2.1 目录结构4.2.1.1 单级目录结构4.2.1.2 两级目录结构4.2.1.3 多级目录结构4.2.1.4 无环图目录结构 4.2.2 索引结点(FCB的改进) 4.3 文件的物理结构4.3.1 连续分配4.3.2 链接分配4.3.2.1 隐式链接4.3.2.2 显式链接 4.3.3 索引分配 …

稠密点云获取方法(二)

作为高分辨率三维重建的方法之一,从单张图像生成稠密三维点云在计算机视觉领域中一直有着较高的关注度。 以下文献提出了一种针对二维和三维信息融合的方法以解决三维点云稀疏难以检测远处的目标的问题。 Multimodal Virtual Point 3D Detection 该文献提出一种将 RGB 传感器…

【Mysql】| 超详细常见bug及解决方案

目录 一. &#x1f31f; 引入话题二. &#x1f31f; 引出bug1.1 查看bug1.2 Problem Solving2.1 查看bug2.2 Problem Solving3.1 字段长度异常3.2 Problem Solving 三. &#x1f31f; 最后 一. &#x1f31f; 引入话题 MySQL是一款广泛使用的开源数据库管理系统&#xff0c;它…

小白了解Docker容器技术

一、什么是Docker&#x1f451; 有一个最常见的例子来很好的帮我们简单了解Docker容器技术&#xff1a; 当我们在一台计算机中配置好了环境&#xff0c;花费了极大的时间和精力成功开发部署好了一个应用。准备尝试在不同操作系统、不同环境下部署这个应用时&#xff0c;我们需要…

图及其与图相关的算法

⭐️前言⭐️ 本篇文章主要介绍图及其与图相关的算法 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主…

如何在 Rocky Linux 上检查磁盘空间?

在 Rocky Linux 上检查磁盘空间是系统管理和维护的重要任务之一。磁盘空间的监控和管理可以帮助我们及时发现和解决存储空间不足的问题&#xff0c;以确保系统的正常运行。本文将详细介绍在 Rocky Linux 上检查磁盘空间的方法。 方法 1&#xff1a;使用 df 命令 df 命令是 Li…

SOLIDWORKS技巧大全培训教程

1 您可以使用 CTRLTAB 键循环进入在 SolidWorks 中打开的文件。 2 使用方向键可以旋转模型。按 CTRL 键加上方向键可以移动模型。按 ALT 键加上方向键可以将模型沿顺时针或逆时1 您可以使用 CTRLTAB 键循环进入在 SolidWorks 中打开的文件。 2 使用方向键可以旋转模型。按 CTRL…

【CloudCompare教程】012:基于点云数据的测量功能

本文讲解CloudCompare基于点云数据的测量功能,主要有:点云索引、坐标、距离、角度、面积、标签等。 文章目录 一、加载地形点云数据二、基于点云数据的测量功能1. 选择单点并显示信息2. 选择两点并显示分割信息3. 选择三点并显示相关三角形信息4. 定义矩形2D标签5. 保存当前标…

Milvus向量数据库

Milvus vector database 第一章 Milvus概述 Milvus创建于2019年&#xff0c;唯一的目标是&#xff1a;存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量embedding vectors。 存储对象&#xff1a;向量 NOTE&#xff1a;embedding vectors是对非结构…

c#快速入门(下)

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;Inline和lambda委托和lambda &#x1f449;&#x1f…

上海斯歌荣获中国低代码/零代码行业“卓越影响力厂商奖”

3月19日&#xff0c;在「第三届中国 ISIG 产业智能大会」隆重的颁奖典礼上&#xff0c;上海斯歌被授予“卓越影响力厂商奖”&#xff0c;并入围国内权威咨询机构LowCode低码时代的《2022年中国低代码&零代码行业研究报告》卓越影响力榜单。 「第三届ISIG中国产业智能大会」…

如何编写接口自动化框架系列通过yaml来管理测试用例(四)

本文是接口自动化测试框架系列篇的第四篇 &#xff0c;主要介绍yaml包的使用 。自动化测试的本质是将功能测试用例交给代码去 目录 1. yaml介绍&#xff1f; 2.python中的yaml包 3.项目中使用yaml包 4 项目总结 执行 &#xff0c;测试人员往往是在自动化框架添加对应的测试…