C++:STL的引入和string类

news2024/12/25 12:49:55

文章目录

  • STL
    • STL是什么
    • STL的六大组件
  • string
  • string类内成员函数
  • 迭代器

STL

STL是什么

什么是STL?STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

STL的六大组件

要学一个新知识,知道这个知识从大方向看有什么内容是必须的

六大组件主要如下所示

在这里插入图片描述
STL是C++的重要组成部分,如果把前面数据结构模拟实现的过程看成造轮子,那STL就是用前人创造好的轮子进行更高效率的工作
站在前人的肩膀上快速开发

那下面就开始学习string,学习新知识要有阅读文档的能力,有阅读文档的能力是必要的,本文及以后采用的是cplusplus的网站进行文本阅读和知识学习

string

在这里插入图片描述
上面是截取自该网站的内容信息,首先从中我们可以获取的信息有,string其实是typedef来的,是由basic_string来的,其次,标准string类通过类似于标准字节容器的接口提供了对此类对象的支持,但添加了专门设计用于操作单字节字符串的特性,前面也将到,string类是提供顺序字符的对象

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列

那既然string是一个类,那么就必然有类内的成员函数:

string类内成员函数

string类对象中,成员函数相当多,这里先写一些比较常用的

首先是构造函数:

在这里插入图片描述
下面是对构造函数的用法:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	char arr[] = { "hello world" };
	string s1;   // 构造空的string对象
	string s2(arr); // 用cstring构造string类对象
	string s3(10, 'a'); // 构造包含10个a的string类对象
	string s4(s2);  // 拷贝构造
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << endl;
	return 0;
}

其次是赋值重载

这是C++98的标准
在这里插入图片描述

在C++98的基础上,C++11又做出了新的改变,增加了新的赋值方式,但整体上还是利用C++98较多一些

在这里插入图片描述

访问元素的方式

在这里插入图片描述
从这里可以看出,运算符重载功能的强大,极大的增加了代码的可读性,以下面的例子来看:

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

这里表面上看是和C语言中对字符串的遍历一样,事实上并不一样,这里使用的是运算符重载,增加了代码的可读性

下面是和容量相关的操作:
在这里插入图片描述

迭代器

迭代器是STL中的重要组成部分,在几乎所有容器中,迭代器的用法相似,这里对迭代器进行重点介绍,其他容器的用法和这里是大差不差的

在这里插入图片描述
首先要看到迭代器是什么?迭代器的作用是什么?

如果从功能来看,迭代器可以理解成指针,利用指针来对string类内存储的数据进行多项操作,迭代器的作用可以对string类内成员进行成员访问,从而进行读和写等其他操作均有

这里首先看begin和end

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

上面是迭代器的用法,再看C语言中我们想要访问一个字符串是如何遍历的?

int main()
{
	char s1[] = { "hello world" };
	char* ptr = s1;
	while (*ptr)
	{
		cout << *ptr << " ";
		ptr++;
	}
	cout << endl;
}

从中也可以看出实际上,迭代器从功能来讲就是指针

这里需要注意迭代器的定义是如何定义的

在这里插入图片描述

在这里插入图片描述

对于不同的迭代器,定义的时候定义方法是不一样的

下面来看rbegin和rend,和前面不同,里面多了一个r,这个r的意思,实际上就是reverse,意思是反转,因此rbegin的意思就是反转着去读取数据

int main()
{
	string s1 = "hello world";
	string::iterator it = s1.begin();
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

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

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

相关文章

微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

前言 最近在做微信小程序项目中&#xff0c;有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能&#xff0c;遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题&#xff0c;网上很多说给scroll-view设置一个高度啥的就可以解决&#xff0c;有些人设置了…

嵌入式软件开发有没有捷径

嵌入式软件开发有没有什么捷径&#xff1f;不定期会收到类似的问题&#xff0c;我只想说&#xff1a;嵌入式软件开发没有捷径 说实话&#xff0c;有这种想法的人&#xff0c;我其实想劝你放弃。对于绝大多数普通人&#xff0c;一步一个脚印就是捷径。 当然&#xff0c;这个问题…

若依(RuoYi)系统添加自定义的模块

RuoYi系统是干什么用的,这里不过多说明了,自己搜一下,其提供的功能己经基本满足了一些简单的系统应用,如果想进行二次开发的小伙伴,可能会想仅仅用Ruoyi的后台权限管理,但是业务功能想进行自定义,可以借鉴一下本文。我们用的是前后端分离版 一、前端的自定义模块 其实在…

Drools用户手册翻译——第四章 Drools规则引擎(九)Phreak算法

这个地方我是先了解了Rete算法&#xff0c;才来看得这一部分&#xff0c;结果发现好像没有什么用......完全不知道讲的什么&#xff0c;估计之后在用的时候慢慢会明白。 RETE算法笔记&#xff1a;http://t.csdn.cn/iNZ8V 甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只…

二叉树的最近公共祖先,二叉搜索树的最近公共祖先(同一个思路)

题目链接   二叉树的最近公共祖先   给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。   百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可…

GD32F103输入捕获

GD32F103输入捕获程序&#xff0c;经过多次测试&#xff0c;终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚&#xff0c;捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮&#xff0c;第1次按下采集一个值保存到TIMER2_CountValue1中&#xff0c;第2次按下采集一个值保存到TIM…

如何使jwt生成的 token在用户登出之后失效?

问题1:如何使jwt生成的 token在用户登出之后失效? 由于jwt生成的token是无状态的,这体现在我们在每一次请求时 request都会新建一个session对象: 举个例子: @PostMapping(value = "/authentication/logout") public ResponseEntity<BaseResult> logOut(Htt…

第十次CCF计算机软件能力认证

第一题&#xff1a;分蛋糕 小明今天生日&#xff0c;他有 n 块蛋糕要分给朋友们吃&#xff0c;这 n 块蛋糕&#xff08;编号为 1 到 n&#xff09;的重量分别为 a1,a2,…,an。 小明想分给每个朋友至少重量为 k 的蛋糕。 小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋…

Spring之浅谈AOP技术

前言 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff09;&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构。 OOP&#xff08;Object Oriented Programming&#xff09;面向对象编程 AOP和OOP一样都是一种编程思想&#xff0c…

佑友防火墙后台命令执行漏洞

漏洞描述 佑友防火墙 后台维护工具存在命令执行&#xff0c;由于没有过滤危险字符&#xff0c;导致可以执行任意命令 漏洞复现 访问url 使用弱口令登录佑友防火墙后台 User: admin Pass: hicomadmin 点击系统管理 维护工具 Ping 输入可执行命令 127.0.0.1|cat /etc/passwd

【高级程序设计语言C++】AVL树

1. AVL树的概念2. AVL树的旋转2.1. 左单旋2.2 右单旋2.3 左右双旋2.4 右左双旋 1. AVL树的概念 AVL树是一种自平衡二叉搜索树&#xff0c;它在每次插入或删除节点时自动调整以保持树的平衡。AVL树的平衡是通过节点的高度差来衡量的&#xff0c;即左子树的高度和右子树的高度之…

Gartner:2022年全球IaaS公有云服务市场增长30%,首次突破1000亿美元

根据Gartner的统计结果&#xff0c;2022年全球基础设施即服务&#xff08;IaaS&#xff09;市场从2021年的928亿美元增长到1203亿美元&#xff0c;同比增长29.7%。亚马逊在2022年继续排在IaaS市场的第一名&#xff0c;其次是微软、阿里巴巴、谷歌和华为。 最新消息&#xff0c;…

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建 qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…

无涯教程-Lua - 文件I/O

I/O库用于在Lua中读取和处理文件。 Lua中有两种文件操作&#xff0c;即隐式(Implicit)和显式(Explicit)操作。 对于以下示例&#xff0c;无涯教程将使用例文件test.lua&#xff0c;如下所示。 -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用以下语句。…

计算机毕设 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

vscode 第一个文件夹在上一层文件夹同行,怎么处理

我的是这样的 打开终端特别麻烦 解决方法就是 打开vscode里边的首选项 进入设置 把Compact Folders下边对勾给勾掉

acwing 1064 小国王 线性状态压缩DP

输入 3 2输出 16&#x1f37a; AC code #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector>using namespace std;typedef long long ll; const int N 12; const int M 1 << 10, K 110;//…

Openlayers:DWS-DD坐标形式互相转换

参考google地图, 坐标分为DD和DMS两种形式。 在本示例中,DWS-DD做互相转换。Openlayers处理DD-》DMS很简单,逆向操作需要做反向推导,方法参考源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有…

Linux【网络基础】IP协议

文章目录 一、IP协议&#xff08;1&#xff09;IP地址协议概念和理解&#xff08;2&#xff09;IP地址协议格式&#xff08;3&#xff09;网络号和主机号&#xff08;4&#xff09;地址管理&#xff08;一&#xff09;分配IP地址方法&#xff08;二&#xff09;CIDR分配IP地址&…