[C++]:8.C++ STL引入+string(介绍)

news2025/1/20 16:17:35

C++ STL引入+string(介绍)

  • 一.STL引入:
    • 1.什么是STL
    • 2.什么是STL的版本:
      • 2-1:原始版本:
      • 2-2:P. J 版本:
      • 2-3:RW 版本:
      • 2-4:SGL版本:
    • 3.STL 的六大组件:
    • 4.STL的意义:
  • 二.string类:
    • 1.string 类:
    • 2.流插入和流提取操作符:
    • 3.赋值操作符:
    • 4.string类的常见构造:
      • string()
      • string(const char*)
      • string(size_t n,char C)
      • string(const string& s) :拷贝构造
      • string(const string& s,size_t pos,size_t len = npos):范围拷贝
      • 补充:析构函数是自动调用的。
    • 5.容量相关的代码:
      • size() :返回字符串有效字符串长度数
      • length() :返回字符串有效字符串长度数
      • capacity():返回空间总大小:
      • empty():判断字符串是否为空串,空返回true ,不为空返回false
      • clear()清空有效字符
      • reserve()为字符串预留空间
      • resize() 将有效字符改成n个并且多的使用字符C填充
    • 6.string 类对象的遍历:
      • 6-1:通过重载的[]下标访问操作符:
      • 6-2:通过iterator迭代器实现遍历:
      • 6-3:通过string 的迭代器可以类比其他的容器的迭代器:
      • 6-4:通过范围for实现遍历:
    • 7.两个算法:
      • 7-1:逆置算法:reverse()
      • 7-2:交换算法:
    • 8:三个练习题:
      • 8-1:把字符串转换成整数:
      • 8-2:反转字符串:
      • 8-3:字符串中第一个唯一字符:

一.STL引入:

1.什么是STL

STL(standard template libaray 标准模板库):是C++ 标准库(还包括有IO库:智能指针库:)的重要组成部分,不仅仅是一个可以复用的组件库,而且还是一个包含数据结构与算法的软件框架。

2.什么是STL的版本:

2-1:原始版本:

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。
唯一的条件就是也需要向原始版本一样做开源使用。(如果你写了一个库是基于STL的内容进行的修改那么这个库需要进行开源)
……
HP 版本–所有STL实现

2-2:P. J 版本:

由P.J plauger 开发,继承自hp版本,windows visual C++ 采用,不可以公开和修改。

2-3:RW 版本:

由Rouge Wage 开发,继承自hp版本,被C++ buider 采用,不可以公开或者修改。

2-4:SGL版本:

由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

3.STL 的六大组件:

在这里插入图片描述

4.STL的意义:

STL是C++中重要的作品有了STL许多底层的数据结构和算法都不需要自己重新造轮子。可以让我们站在巨人的肩膀上进行快速高效的开发!

总结:STL学习的三个境界:能用,明理,能扩展。

二.string类:

引入:在C语言中,字符串是用\0结尾的一串字符的集合,为了方便操作C语言提供了一系列的字符串系列的函数,但是这些库函数是和字符串是分离开来的不符合面向对象的思想,并且字符串空间的数据需要用户自己管理和释放容易导致产生越界访问!

1.string 类:

1.我们会发现string类是由一个basic_string 一个类模板实例化生成的一个类的typedef 重命名的。
2.使用需要带头文件()和 using namespace std;

在这里插入图片描述

2.流插入和流提取操作符:

string类重载了流插入和流提取操作符,他们是类的友元函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

运行代码可以得到几个结论:
1.cout正常打印字符串内容包括空格:
2.cin不可以插入中间存在空格的字符串,只能把第一个空格之前的内容输入进字符串对象中。

3.赋值操作符:

在这里插入图片描述
支持:
string=string
string = const char*
string = char

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.string类的常见构造:

string()

构造空的字符串类对象
在这里插入图片描述

string(const char*)

用常量字符串构造string对象:
在这里插入图片描述

string(size_t n,char C)

个数+字符的形式的构造函数:
在这里插入图片描述

string(const string& s) :拷贝构造

在这里插入图片描述

string(const string& s,size_t pos,size_t len = npos):范围拷贝

1.从s的pos位置开始拷贝len个字符到新的字符串里面去!
2.npos的默认缺省值为-1 但是因为len类型为size_t 类型所以默认值是非常大的!
3.len的值比较大的时候如果被拷贝的字符串后面没有字符了就不会拷贝了!

在这里插入图片描述
在这里插入图片描述

补充:析构函数是自动调用的。

5.容量相关的代码:

size() :返回字符串有效字符串长度数

在这里插入图片描述

length() :返回字符串有效字符串长度数

在这里插入图片描述
总结:为什么有两个方法都可以计算字符串的有效字符个数,因为STL库的出现没有string这个类早,早的时候使用的是length计算个数。后来STL库出来之后使用size方法计算各种类的元素个数所以又给string类添加了一个方法用来计算有效字符个数。

ps:下面内容后面会补充

capacity():返回空间总大小:

empty():判断字符串是否为空串,空返回true ,不为空返回false

clear()清空有效字符

reserve()为字符串预留空间

resize() 将有效字符改成n个并且多的使用字符C填充

6.string 类对象的遍历:

6-1:通过重载的[]下标访问操作符:

在这里插入图片描述

基本使用:
在这里插入图片描述

循环遍历操作:
在这里插入图片描述
在这里插入图片描述
总结:通过重载的下标范围操作符是不可以进行内存空间的跳跃访问(比如链表:树:图:哈希等)的所以存在iteratoriterator迭代器实现遍历。

6-2:通过iterator迭代器实现遍历:

1.iterator 是一个类型(类似指针类型,指针指向对象的成员。)被类限定但是不被访问限定符限定:
2.通过类名+访问限定符进行访问。
3.类提供了方法去返回头尾指针(类似地址的东西)。

在这里插入图片描述
在这里插入图片描述

1.可读可写:
在这里插入图片描述

2.只读:
在这里插入图片描述

总结:返回的访问指针begin() end() 是满足左闭右开的!

6-3:通过string 的迭代器可以类比其他的容器的迭代器:

顺序表:
在这里插入图片描述
列表:
在这里插入图片描述

6-4:通过范围for实现遍历:

在这里插入图片描述

7.两个算法:

7-1:逆置算法:reverse()

在这里插入图片描述

字符串的逆置:
在这里插入图片描述

7-2:交换算法:

考虑使用迭代器和循环遍历实现一个逆置:
在这里插入图片描述

8:三个练习题:

8-1:把字符串转换成整数:

在这里插入图片描述
题目链接:

class Solution {
public:
    int StrToInt(string str)
    {
    string::iterator it = str.end();
	int count = 1;
	int sum = 0;
	while (it != str.begin())
	{
		it--;
		char tmp = (*it);

		if (tmp >= 48 && tmp <= 57)
		{
			sum += (((int)(tmp - '0')) * count);
		}
		else
		{
			if (it == str.begin())
			{
				if (tmp == '-')
				{
					sum *= -1;
				}
				else
				{
					break;
				}
			}
			else
			{
				sum = 0;
				break;
			}
		}
		count *= 10;
	}
	return sum;
    }
};

8-2:反转字符串:

在这里插入图片描述
题目链接

class Solution {
public:
    void reverseString(vector<char>& s) {
        reverse(s.begin(),s.end());
        vector<char>::iterator it = s.begin();
        while(it!=s.end())
        {
            cout<<*it;
            it++;
        }
    }
};

8-3:字符串中第一个唯一字符:

在这里插入图片描述
题目链接

class Solution {
public:
    int firstUniqChar(string s) {
               int arr[26] = { 0 };

        string::iterator it = s.begin();
        while (it != s.end())
        {
            int indx = (int)(*it - 97);
            arr[indx]++;

            it++;
        }

        string::iterator it1 = s.begin();
        int count = 0;
        while (it1 != s.end())
        {
            for (int i = 0; i < 26; i++)
            {
                if (arr[(int)((*it1) - 97)] == 1)
                {
                    return count;
                }
            }
            count++;
            it1++;
        }
        
        return -1;
    }
};

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

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

相关文章

JS-项目实战-删除库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);}} }//当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取…

YOLOv8-Seg改进: 捕捉空间上的局部关系和全局关系的CoordAttention注意力 | 分割注意力系列篇

🚀🚀🚀本文改进:CoordAttention注意力,引入到YOLOv8-seg,CoordAttention在计算注意力时,不仅会考虑输入的特征信息,还会考虑每个像素点的位置信息,从而更好地捕捉空间上的局部关系和全局关系。 🚀🚀🚀Context Aggregation小目标分割&复杂场景首选,实现…

Python winreg将cmd/PowerShell(管理员)添加到右键菜单

效果 1. 脚本 用管理员权限运行&#xff0c;重复执行会起到覆盖效果&#xff08;根据sub_key&#xff09;。 icon自己设置。text可以自定义。sub_key可以改但不推荐&#xff08;避免改成和系统已有项冲突的&#xff09;。command不要改。 from winreg import *registry r&q…

前端转行可以做什么

前端开发者通常拥有很好的技术背景和解决问题的能力&#xff0c;所以有很多可能的职业选择。以下是一些可能的选择&#xff1a; 全栈开发&#xff1a;这是一个非常热门的职位&#xff0c;需要能够处理前端和后端工作。使用多种编程语言和技术来构建从数据库到用户界面的整个应…

ps5计时计费软件安装教程,佳易王电玩店计时收费系统

ps5计时计费软件安装教程&#xff0c;佳易王电玩店计时收费系统 一、佳易王电玩PS5游戏厅计时计费软件部分功能简介&#xff1a; 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;商品可以绑定桌…

【深度学习实验】网络优化与正则化(五):数据预处理详解——标准化、归一化、白化、去除异常值、处理缺失值

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、优化算法0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

ubuntu云服务器配置SFTP服务

目录 一、安装并运行SSH服务 1&#xff0c;安装ssh服务 2&#xff0c;运行ssh 3&#xff0c;查看ssh运行状态 二、创建SFTP用户并进行用户相关的配置 1&#xff0c;创建SFTP用户 2&#xff0c;限制用户只能使用 SFTP&#xff0c;并禁止 SSH 登录。打开/ect/ssh/sshd_conf…

一文看懂Spark中Cache和CheckPoint的区别

目录 循循渐进理解使用Cache或者PersistCheckPoint缓存和CheckPoint的区别 循循渐进理解 wc.txt数据 hello java spark hadoop flume kafka hbase kafka flume hadoop看下面代码会打印多少条-------------------------(RDD2) import org.apache.spark.rdd.RDD import org.ap…

这就是思维导图!全面分析思维导图的实际用途

思维导图是一种以图形方式呈现的思维工具&#xff0c;它以中心主题为核心&#xff0c;通过分支展开相关的子主题和想法。它可以帮助我们更好地组织和理解信息&#xff0c;提高学习、工作和生活的效率。 在信息爆炸的时代&#xff0c;有效地管理和利用大量的信息成为一个亟待解决…

Linux - Namespace

一、namespace 是什么&#xff1f; Linux namespaces 是对全局系统资源的一种封装隔离&#xff0c;使得处于不同 namespace 的进程拥有独立的全局系统资源&#xff0c;改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程&#xff0c;对其他 namespace 中的进程没…

12-2- DCGAN -简单网络-卷积网络

功能 随机噪声→生成器→MINIST图像。 训练方法 1 判别器的训练,首先固定生成器参数不变,其次判别器应当将真实图像判别为1,生成图像判别为0 loss=loss(real_out, 1)+loss(fake_out, 0) 2 生成器的训练,首先固定判别器参数不变,其次判别器应当将生成图像判别为1 loss =…

如何避免在Flask中使用Response对象

在Flask框架中&#xff0c;Response对象的__bool__和__nonzero__方法被重载&#xff0c;以便返回一个表示HTTP响应状态是否为’OK’的布尔值。然而&#xff0c;这可能会导致一些预期之外的行为。 解决方案 对于上述问题&#xff0c;可以通过直接检查Response对象的ok属性来避…

在哪里可以制作一本精美的翻页产品册呢?

你是否曾经为了一张可滑动的画册而翻看了整个产品册&#xff1f;翻页产品册是一种数字化的画册形式&#xff0c;它可以在电脑、手机、平板等设备上进行浏览和阅读。相比传统的纸质画册&#xff0c;翻页产品册有着更多的优势和用途。那么&#xff0c;在哪里可以制作一本这种精美…

解决requests库中session.verify参数失效的问题

在使用requests库进行HTTP请求时&#xff0c;如果在环境变量中设置了’REQUESTS_CA_BUNDLE’&#xff0c;并且在session对象中设置了verify参数为False&#xff0c;那么API请求会使用环境变量中的值而不是session对象中的值。这是因为在requests库中&#xff0c;当session对象中…

(十一)Flask模板引擎jinja2

模板引擎Jinja2 一、简介及基本使用&#xff1a; Flask使用Jinja2作为默认的模板引擎。Jinja2是一个功能强大且易于使用的模板引擎&#xff0c;它允许我们在HTML中嵌入Python代码&#xff0c;并通过将模板和数据进行渲染来生成动态内容。 实战之在Flask中使用Jinja2模板引擎…

GDS 命令的使用 srvctl service TAF application continuity

文档中prim and stdy在同一台机器上&#xff0c;不同机器需要添加address list TAF ENABLED GLOBAL SERVICE in GDS ENVIRONMNET 12C. (Doc ID 2283193.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.…

操作系统(五)文件系统和I/O系统

文章目录 前言文件系统文件系统和文件文件描述符目录、文件别名和文件系统分层文件系统目录实现文件别名名字解析&#xff08;路径遍历&#xff09;文件系统挂载文件系统种类 虚拟文件系统文件缓存和打开文件打开文件 文件分配空闲空间管理和冗余磁盘阵列RAID空闲空间管理冗余磁…

小程序游戏、App游戏与H5游戏:三种不同的游戏开发与体验方式

在当今数字化的时代&#xff0c;游戏开发者面临着多种选择&#xff0c;以满足不同用户群体的需求。小程序游戏、App游戏和H5游戏是三种流行的游戏开发和发布方式&#xff0c;它们各自具有独特的特点和适用场景。 小程序游戏&#xff1a;轻巧便捷的社交体验 小程序游戏是近年来…

为什么都说学医的转行网络安全行业更容易些?

网络系统坏了&#xff0c;被入侵破坏了&#xff0c;找安全工程师防护修补。如果没有修好&#xff0c;我可以不给钱&#xff0c;再找一家能修好的。但是看病就不一样了&#xff0c;就算医生没有给我治好病&#xff0c;也照样要收医疗费。 这样的类比乍一听上去好像挺有道理&…

解析:什么是生成式AI?与其他类型的AI有何不同?

原创 | 文 BFT机器人 快速浏览一下头条新闻&#xff0c;你会发现生成式AI似乎无处不在。事实上&#xff0c;一些新闻标题甚至可能是通过生成式AI编写的&#xff0c;例如OpenAI旗下的ChatGPT&#xff0c;这个聊天机器人已经展现出了生成看起来像人类所写文本的惊人能力。 当人们…