【C++初阶】string

news2024/11/24 15:43:45

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋string类

  • 🍑STL简介
    • 🍍STL的由来
    • 🍍STL的发展
    • 🍍STL的版本
    • 🍍STL的六大组件
    • 🍍STL的重要性
  • 🍑string构造(constructor)
    • 🍍无参构造
    • 🍍带参的字符串构造
    • 🍍拷贝构造
    • 🍍指定位置构造
    • 🍍指定数据拷贝
    • 🍍填充
  • 🍑string析构(destructor)
  • 🍑string赋值(operator=)
  • 🍑string遍历和访问
    • 🍍获取string长度
    • 🍍获取string类str中的字符
    • 🍍迭代器
    • 🍍逆置函数
    • 🍍反向迭代器
    • 🍍开空间函数
    • 🍍查看空间容量
  • 🍑string增删查改
    • 🍍增
    • 🍍删
    • 🍍找
    • 🍍改

🍑STL简介

🍍STL的由来

最初是由一位美国科学家提出。当时,美国计算机科学家Alexander Stepanov在Hewlett-Packard公司的实验室中工作,他在编写与计算机科学相关的程序时,深感程序员需要一种通用的编程模式,以便更加方便地实现各种数据结构和算法。基于这种认识,他开始着手设计一种新的C++库,这便是STL的雏形。

STL最初由Andrew Koenig和其他C++专家小组进行设计,并在1995年C++标准委员会的推荐下,成为C++标准库的一部分。STL的早期版本,即SGI-STL(Silicon Graphics STL),由Alexander Stepanov和Meng Lee在Silicon Graphics公司开发,并在1994年的SGI工作站上发布。虽然这是STL的雏形,但它并不是一个标准的C++库。

然而,STL的潜力被很快认识到,许多厂商和开源社区开始采用并进一步发展它。出于对SGI拥有版权的限制,后来形成了多个同源的STL版本,如STLport、Apache STL等。

🍍STL的发展

首先,STL的原型最初由Andrew Koenig和其他C++专家小组设计,并在1995年得到了C++标准委员会的推荐,从而正式成为C++标准库的一部分。这个早期的STL版本为C++程序员提供了一组通用的数据结构和算法,大大简化了C++程序的开发过程。

然后,STL的发展进入了另一个重要阶段,那就是SGI-STL(Silicon Graphics STL)版本的诞生。这个版本由Alexander Stepanov和Meng Lee在Silicon Graphics公司开发,并在1994年发布。SGI-STL为STL的发展奠定了坚实的基础,它的出现推动了STL在业界的广泛接受和应用。

随着C++标准的不断更新,STL也得到了持续的发展。从C++03的修订版开始,STL在容器、迭代器、算法等方面都得到了进一步的扩展和优化。特别是C++11标准的发布,为STL带来了许多新的特性和改进。例如,C++11中新增了多种容器类型(如std::array、std::forward_list、std::unordered_map等),以及智能指针(如std::unique_ptr、std::shared_ptr等),这些新特性大大增强了STL的功能和实用性。

🍍STL的版本

  1. 原始版本(HP 版本):Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP版本是所有STL实现版本的始祖。
  2. P. J. 版本:由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,
    符号命名比较怪异。
  3. RW版本:由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
  4. SGI版本:由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

🍍STL的六大组件

  1. 容器:容器是STL中最重要的组件之一,它提供了各种数据结构,如vector、list、deque、set、map等。这些容器用于存储和管理数据,并提供了对数据的基本操作。
  2. 算法:STL包含了一系列算法,用于对容器中的数据进行各种操作,如排序、搜索、复制、删除等。这些算法以函数模板的形式实现,可以与容器和迭代器一起使用,实现灵活且高效的数据处理。
  3. 迭代器:迭代器是STL中用于遍历容器元素的工具。它们提供了一种抽象化的方式,使得程序员可以像操作指针一样操作容器中的元素。迭代器在算法和容器之间起到了桥梁的作用,使得算法可以无缝地应用于各种容器。
  4. 仿函数:仿函数也被称为函数对象,其行为类似于函数,但实际上是重载了operator()的class或class template。它们可以作为算法的某种策略,用于定制算法的行为。
  5. 适配器:适配器是一种修饰容器、仿函数或迭代器接口的工具。它们可以改变容器、仿函数或迭代器的行为,使其适应不同的使用场景。例如,STL中的queue和stack就是使用deque作为底层容器实现的适配器。
  6. 配接器:配接器主要用于管理STL容器在分配和释放内存时的行为。它负责提供自定义的内存管理策略,以满足特定应用程序的需求。虽然配接器也是STL的一个重要组件,但在某些资料或讨论中可能不被单独列出为六大组件之一。

🍍STL的重要性

首先,STL大大简化了C++编程的复杂性。它提供了一套高效且易于使用的数据结构和算法,使得程序员无需从头开始实现这些基础功能,从而可以将更多的精力投入到业务逻辑的实现上。

其次,STL提高了代码的可重用性和可维护性。通过使用STL中的通用模板,程序员可以编写出更加通用和灵活的代码,减少了重复劳动和代码冗余。同时,STL也遵循严格的编程规范和标准,使得代码更加易于理解和维护。

再者,STL的性能优化也是其重要性的体现之一。STL中的数据结构和算法都经过了精心设计和优化,能够在各种场景下提供高效的性能表现。这使得使用STL的C++程序在运行时能够更加快速和稳定。

最后,STL的广泛应用也证明了其重要性。无论是在学术研究、商业开发还是个人项目中,STL都得到了广泛的应用和认可。它已经成为了C++程序员必备的工具之一,也是学习C++编程的重要组成部分。

STL在C++编程中的重要性不言而喻。它简化了编程复杂性、提高了代码的可重用性和可维护性、优化了性能表现,并且得到了广泛的应用和认可。因此,对于想要深入学习C++编程的程序员来说,掌握STL是非常必要的。

🍑string构造(constructor)

关于STL中容器string类,头文件名为#include

🍍无参构造

string()

string  str;

在这里插入图片描述
无参构造就是空的string类对象。

🍍带参的字符串构造

string(const char* str)

string str("hello world");

在这里插入图片描述

🍍拷贝构造

string(const string& str)

string  str1("hello wrold");
string  str2(str1);

在这里插入图片描述

🍍指定位置构造

string(const string& str, size_t pos, size_t len = npos),npos是一个全局变量,赋值为-1,防止给的参数太大。

string str1("hello world");
string str2(str1, 1, 6);
//从str1的第一个位置后开始拷贝,拷贝6个数据,
//空格也算一个位置,从首字母开始计算。

在这里插入图片描述

🍍指定数据拷贝

string(const string& str, size_t n)

string str1("hello world");
string str2(str1, 3);

在这里插入图片描述

🍍填充

string(size_t n, char str)

string str(10, 'a');

在这里插入图片描述

🍑string析构(destructor)

~string();

析构函数系统会自动调用。

🍑string赋值(operator=)

string str1("hello world");
string str2 = str1;
string str3 = "hello world";

在这里插入图片描述

🍑string遍历和访问

🍍获取string长度

string str("hello world");
cout << str.size() << endl;
cout << str.length() << endl;

在这里插入图片描述
两个都不计算斜杠0,但都计算空格的大小。

🍍获取string类str中的字符

下标法:

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

在这里插入图片描述

范围for:

string str("hello world");
for (auto ch : str)
{
	cout << ch << " ";
}
cout << endl;

在这里插入图片描述

🍍迭代器

iterator,该迭代器的用法有点像指针

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

在这里插入图片描述
迭代器的用法很多,上面范围for底层就是迭代器,等后面大家学的知识多了,就能理解了。

🍍逆置函数

reverse(), 也是搭配了迭代器使用

string str("hello world");
reverse(str.begin(), str.end());
string::iterator it = str.begin();
while(it != str.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

在这里插入图片描述
该逆置函数,可逆置大部分数据类型 ,如链表、栈等等。

🍍反向迭代器

reverse_iterator

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

在这里插入图片描述

🍍开空间函数

reserve(), resize()

string str1("hello world");
str1.reserve(4);
string str2("hello world");
str2.size(4);

在这里插入图片描述
从程序运行结果来看:
reserve()开空间只影响容量而不影响数据,而resize()开空间不仅会影响容量还会影响数据。

🍍查看空间容量

capacity(), size()

string str1("hello world");
str1.reserve(100);
string str2("hello world");
str2.size(100);

在这里插入图片描述
capacity()会计算空间的大小,而不去管有效数据的数量。
size()只会计算有限数据的个数。

🍑string增删查改

🍍增

string str("hello world");
str.push_back('a');//增加单个字符
str.append("abcd");//增加字符串
//这两者可以混合使用

str.insert(4, "pppp");//插入函数

在这里插入图片描述

string str1("hello world");
string str2("abcd");
str1 += "ppp";
str1 += 'a';
str1 += str2;

在这里插入图片描述
实际上述程序使用+=操作符是调用库里面operator+=()函数

🍍删

erase()

string str("hello world");
str.erase(2, 4);
//在str的第二个位置往后删除4个数据
//如果超过有效长度,则有多少就删掉多少。

在这里插入图片描述
从程序执行结果看,空格也占一行。

🍍找

find(),rfind()

string str("hello world");
int ret1 = str.find('e', 0);
int ret2 = str.find('p', 0);

在这里插入图片描述
找到就返回找到的个数,没找到就返回-1;

rfind()函数就和find()找的方向相反,find()是从左向右,而rfind()就是从右向左。

🍍改

replace()

string str("hello");
str.replace(4, 1, "abc");
//从str中第四个位置起后的第一个字符替换成"abc"
//不会压榨后面的空间,会临时扩大

在这里插入图片描述

关于本本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!

请添加图片描述
请添加图片描述

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

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

相关文章

echarts tooltip 内容太多,超出范围显示不全问题,亲测有效

参考文章&#xff1a;echarts tooltip显示不全问题 在项目里面的tooltip数据特别多&#xff0c;显示不全问题&#xff08;有下面几种方法&#xff0c;选择最适合自己的&#xff09;&#xff1a; 1、如果盒子还够大&#xff0c;只是tooltip飘到上面或者下面被覆盖住了&#xff…

一文解读 SQL 生成工具

SQL 生成工具可用于测试 Parser 与其他数据库产品的兼容性&#xff0c;通过解析 YACC 语法文件中的产生式&#xff0c;生成对应的 SQL 语句&#xff0c;再使用数据库执行该 SQL&#xff0c;根据结果判断语句是否与其他数据库语法兼容。 01工具使用 语法文件预处理 预处理目的…

13 Linux实操篇-网络配置

第十三章 Linux实操篇-网路配置 13.1 Linux 网络配置原理图 13.2 查看网络IP 和网关 子网ip 与网关 13.3 查看Windows 中 VMnet8 和 Linux 的网络配置 查看Windows 中 VMnet8&#xff1a;ipconfig Linux 的网络配置: ifconfig 13.4 ping 测试主机之间网络连通性 基本语法&a…

教育装备展火热开幕,锐捷网络用科技力量点亮教育未来之光

了解教育装备行业发展新趋势、感受教育装备领域创新脉动。4月19日,一场汇聚智慧与创新的教育行业盛会——第 83 届中国教育装备展示会在山城重庆隆重启幕。位于N4013号的锐捷网络展位不仅汇聚了极简以太全光3.X、三擎云桌面2.X、极简教育城域网等前沿科技方案,更通过样机展示、…

ssl证书是怎么实现数据加密传输的?原理是什么?

SSL证书实现数据加密传输的过程大致可以分为以下几个步骤&#xff1a; 1. 握手阶段&#xff1a; - 客户端请求连接&#xff1a;当用户尝试访问一个HTTPS网站时&#xff0c;浏览器&#xff08;客户端&#xff09;会向服务器发起一个HTTPS请求&#xff0c;请求建立一个安全连接。…

通过iMock学习Jvmsandbox

Jvm-sandbox Jvm-sandbox基于Jvm-sandbox的Mock平台iMockiMock的工程学习iMock怎么写的&#xff08;sandbox的module应该怎么写&#xff09; Jvm-sandbox Jvm-sandbox是阿里开源的一款java的沙箱&#xff0c;看网上的介绍在沙箱里你可以做你能想到的奇妙的事情。 基于Jvm-san…

图题目:可以到达所有点的最少点数目

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;可以到达所有点的最少点数目 出处&#xff1a;1557. 可以到达所有点的最少点数目 难度 4 级 题目描述 要求 给定一个有向无环图&#xff0c;包含编…

Web3与智能合约:科技革新下的新金融时代

在当今数字化时代&#xff0c;Web3和智能合约正在共同塑造着金融领域的未来。Web3作为下一代互联网的重要组成部分&#xff0c;以其去中心化、安全性和透明性为核心特点&#xff0c;正推动着金融行业向着数字化和去中心化的方向发展。而智能合约作为Web3技术的关键应用之一&…

如何将本地项目上传到Github(SSH方式)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

OSPF基本配置

原理概述 OSPF 是一种应用非常广泛的基于链路状态的动态路由协议&#xff0c;它具有区域&#xff08; Area )化的层次结构&#xff0c;扩展性好&#xff0c;收敛速度快&#xff0c;适合部署在各种规模的网络上。 在 OSPF 中&#xff0c;每台路由器都必须有一个 Router-I…

在线商城客服系统,多用户电商系统可API对接客服软件

在当今数字化时代&#xff0c;在线商城客服系统和多用户电商系统之间的无缝API对接已成为电商行业的重要趋势。这种整合为商家提供了更高效的客户服务和管理方式&#xff0c;提升了用户体验和业务效率。其中&#xff0c;商淘云电商客服系统作为一款强大的客服管理工具&#xff…

Java Swing游戏开发学习26

内容来自RyiSnow视频讲解 这一节讲的是Inventory背包&#xff0c;类似RPG游戏中人物角色放置装备、药品、武器、宝石等物品的一个若干行若干列的表格窗口。 可以显示装备物品&#xff0c;并选择它们。 前言 作者说这一节可能是第二部分里面爬起来最高的山峰。 效果 最后还有…

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

IC设计数据传输 如何能保障安全高效?

IC&#xff08;集成电路&#xff09;设计数据&#xff0c;对于IC设计企业来说&#xff0c;其重要性不言而喻。所以IC设计数据传输过程中&#xff0c;其安全性和效率&#xff0c;也需要有保障。 首先我们来看看IC设计数据为什么重要&#xff0c;其重要性体现在多个方面&#xff…

远距离、高品质、低延迟、高保真——SA316无线音频模块带您探索新的音频体验

SA316系列产品分为发射端模块SA316S-TX,SA316F30和接收端模块SA316-RX&#xff0c;该系列方案采用了无线高品质的语音传输芯片来设计&#xff0c;它可以支持外部 PCM / IIS 双模数字音频接口&#xff0c;同时模块为客户提供了标准化的串行接口&#xff0c;使用者可通过串口指令…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时&#xff0c;可以初始化为空指针 int *pNULL; 我们看NULL的定义&#xff0c;可以看出NULL是0被强制转化为Void* 类型的0&#xff1b;实质还是个0&#xff1b; 如何避免野指针&#xff1a; 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…

vue3.2+vite+unocss原子化配置

1、安装unocss&#xff1a;npm install unocss 2、vite.config.ts中配置&#xff1a; 3、创建unocss自己的ts文件&#xff1a;uno.config.ts 根路径下创建&#xff0c; 4、在创建好的uno.config.ts文件中编写如下代码&#xff1a; // uno.config.ts import {defineConfig,prese…

如果把软路由的网段更换成169.254.0.0/16会咋样?

前言 这几天有小伙伴在折腾软路由系统&#xff0c;然后问题就来了。 他咨询的是&#xff1a;为啥电脑连接软路由之后&#xff0c;无法访问软路由的管理页&#xff1f; 嗯。。。确实不是什么大事。但不注意看&#xff0c;还以为软路由没有正常获取到ip。 熟悉网络的小伙伴们都…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…