【C++初阶】string

请添加图片描述

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

🍋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.mzph.cn/web/4918.shtml

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

相关文章

【Linux】信号的产生

目录 一. 信号的概念signal() 函数 二. 信号的产生1. 键盘发送2. 系统调用kill()raise()abort() 3. 软件条件alarm() 4. 硬件异常除零错误:野指针: 三. 核心转储 一. 信号的概念 信号是消息的载体, 标志着不同的行为; 是进程间发送异步信息的一种方式, 属于软中断. 信号随时都…

智能优化算法及 MATLAB 实现(书籍推荐)

智能优化算法及 MATLAB 实现&#xff08;书籍推荐&#xff09; 介绍前言目录第1章 粒子群优化算法原理及其MATLAB实现第2章 哈里斯鹰优化算法原理及其MATLAB实现第3章 沙丘猫群优化算法原理及其MATLAB实现第4章 鲸鱼优化算法原理及其MATLAB实现第5章 大猩猩部队优化算法原理及其…

20232801 2023-2024-2 《网络攻防实践》实践八报告

20232801 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 1.动手实践任务: 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者. 2.动手实践任务二&#xff1a;分析Crackme程序 在WinXP Attac…

Leetcode - 周赛395

目录 一&#xff0c;3131. 找出与数组相加的整数 I 二&#xff0c;3132. 找出与数组相加的整数 II 三&#xff0c;3133. 数组最后一个元素的最小值 四&#xff0c;3134. 找出唯一性数组的中位数 一&#xff0c;3131. 找出与数组相加的整数 I 本题本质就是求两个数组最小值的…

[iOS]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中&#xff0c;一个组件是指一个独立的、可替换的软件单元&#xff0c;它封装了一组相关的功能。组件通过定义的接口与外界交互&#xff0c;并且这些接口隔离了组件内部的实现细节。在Swift语言中&#xff0c;组件可以是一个模块、一…

文献速递:肺癌早期诊断---低剂量胸部计算机断层扫描上的三维深度学习端到端肺癌筛查

Title 题目 End-to-end lung cancer screening with three-dimensional deep learning on low-dose chest computed tomography 低剂量胸部计算机断层扫描上的三维深度学习端到端肺癌筛查 01文献速递介绍 2018年估计有160,000例死亡病例&#xff0c;肺癌是美国最常见的癌症…

青少年软件编程(Scratch一级)等级考试试卷(2019年12月)

客观题 题目总数&#xff1a;35 总分数&#xff1a;70 时间&#xff1a;不限时 CSDN添加图片自带水印&#xff0c;可至文末获取无水印版word文档 第 1 题 单选题 下列关于舞台的描述&#xff0c;不正确的是&#xff1f;&#xff08; &#xff09; A.Scratch只能…

MVVM框架

LifeCycle 翻译为生命周期。意义就是为了监控某个事件的生命周期。 此处用了addObserver函数&#xff0c;代表添加监控者。监控该activity的变化。activity的状态有onCreate,onStop,onDestory等&#xff0c;该函数表示对所有状态进行监听。 该方法使用了标签的方法&#xff0c…

护航智慧交通安全 | 聚铭精彩亮相2024交通科技创新及信创产品推广交流会

4月26日&#xff0c;石家庄希尔顿酒店内&#xff0c;河北省智能交通协会盛大举办2024年度交通科技创新及信创产品推广交流会。聚铭网络受邀参与&#xff0c;携旗下安全产品及解决方案精彩亮相&#xff0c;为智慧交通安全保驾护航。 为深化高速公路创新驱动发展战略&#xff0…

2024 java easyexcel poi word模板填充数据,多个word合成一个word

先看效果 一、准备工作 1.word模版 2.文件路径 二、pom依赖 <!-- easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency><depe…

如何申请免费SSL证书,把网站升级成HTTPS

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是一种用于安全数据传输的网络协议&#xff0c;它可以有效地保护网站和用户之间的通信安全。然而&#xff0c;要使一个网站从HTTP升级到HTTPS&#xff0c;就需要一个SSL证书。那么&#xff0c;如何申请免费的…

一文解读 SQL 生成工具

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

notion使用小tip(待补充)

可以替代思维导图是一个很棒的软件 公式编辑&#xff1a;latex 网站链接&#xff1a;LATEX语法 一些常用的用法&#xff1a; 下标&#xff1a;a_{Si} 分数&#xff1a;\frac{}{} 乘&#xff1a;\times 向量&#xff1a;\vec{} pai (3.14159…) : \pi 直接用公式编辑器&#…

【kettle005】kettle访问Oracle数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下Oracle数据库相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&am…

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈&#xff1a; NextJs&#xff08;前端框架&#xff09;React&#xff08;前端框架&#xff09;TailwindCSS &#xff08;CSS样式&#xff09;echart echart gl &#xff08;地图生成&#xff09;shadui&#xff08;UI组件…

C语言阶段性测试错题纠正与拓展

引言&#xff1a;在2024年4月26日&#xff0c;我进行了C语言知识的“期末考试”。通过这次考试&#xff0c;我发现了我的知识漏洞。所以&#xff0c;我写下这篇博客来记录我的错题&#xff0c;并进行纠正&#xff0c;然后对于以前遗忘知识的回顾。 更多有关C语言的知识详解可前…

HarmonyOS编程实践系列:第一节 - 创建健康App欢迎页

系列文章目录 &#xff08;零&#xff09;鸿蒙HarmonyOS入门&#xff1a;如何配置环境&#xff0c;输出“Hello World“ &#xff08;一&#xff09;鸿蒙HarmonyOS开发基础 &#xff08;二&#xff09;鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 &#xff08;三&#xff09;鸿蒙…

梳理一下低代码的真正价值!另推荐超好用的5款低代码开发平台

一、先来聊聊低代码的真实价值&#xff01; 在回答这个问题之前&#xff0c;我们不妨先来看两个案例&#xff1a; 某连锁商超企业在发展中产生了新的业务需求&#xff0c;一是希望能够快速展示门店销售数据&#xff0c;满足高层的管理需求&#xff1b;二是希望巡店、上架商品…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全&#xff0c;渗透测试&#xff0c;SRC等场景 完整文件已上传知识星球&#xff0c;需要的朋友可加入查看。

Jitter 和相位噪声

近期学习PLL的时候&#xff0c;发现里面有诸多jitter类型&#xff0c;绕晕了&#xff0c;写个帖子记录一下学习过程。 目录 基本jitter和相噪概念 jitter 相位噪声 相位噪声和jitter之间的联系 三种常见的抖动类型及其特点 基本jitter和相噪概念 无噪声振荡器的输出是一…