【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.ppmy.cn/server/23412.html

相关文章

力扣1146 快照数组

思路&#xff1a;初始时&#xff0c;使用的思路是对于每个快照的数组都进行一次副本保存&#xff0c;但是提交后是时间超出。因此基于 灵神. - 力扣&#xff08;LeetCode&#xff09; 的思路不构建数组&#xff0c;而是保存每个数组位置set的记录&#xff0c;记录采用的是键值对…

Axios中的onDownloadProgress函数获取文件流

推荐&#xff1a;axios 请求中断和请求重试 关注博主微信公众号【前端成长营】以后也会持续同步… 微信扫码体验一下 &#xff08;说不定哪天你就用得上&#xff09; 假如 你有一个项目关于聊天的 &#xff0c; 后端接口是个流的的形式返回给前端 &#xff0c; 文字会不停的…

海外云服务对比: AWS、GCP、Azure 与 DigitalOcean

云计算市场持续增长&#xff0c;预计到2030年将达到 2432.87 亿美元。在这个庞大的市场中&#xff0c;三家云服务提供商——亚马逊&#xff08;AWS&#xff09;、谷歌云平台&#xff08;GCP&#xff09;和微软Azure——共占云市场份额的64%。当用户选择云服务提供商来托管他们的…

VPN的基本概念

随着互联网的普及和应用的广泛&#xff0c;网络安全和隐私保护越来越受到人们的关注。在这个信息爆炸的时代&#xff0c;我们的个人信息、数据通信可能会受到各种威胁&#xff0c;如何保护自己的隐私和数据安全成为了一个迫切的问题。而VPN&#xff08;Virtual Private Network…

商店数据(八)

目录 57.后台权限表 58.推荐记录表 ​59.系统上传资源表 ​60.角色表 ​61.订单结算表 62.店铺表 63.店铺认证表 64.店铺申请&#xff08;移动端&#xff09;表 57.后台权限表 CREATE TABLE wat_privilgeid (privilegeod int(11) NOT NULL AUTO_INCREMENT COMMENT 自增…

DataGrip操作Oracle

一、创建表空间 表名任意起&#xff0c;路径自己指定 -- 创建表空间 create tablespace mydb1 -- 表名 datafile E:\Code\sql\oracle\oracle_tablespace\mydb1.dbf --指定表空间路径 size 100M --指定表空间大小 autoextend on next 50M --指定一次扩充多少mb extent managemen…

GMSSL编译iOS

一、GMSSL-2.x 国密SDK源码下载&#xff0c;对GMSSL库进行编译生成对应的静态库。执行如下命令&#xff1a; cd到SDK源码目录 cd /Users/xxxx/Downloads/GMSSLV2-master查看SDK适用环境 ./config上图中错误解决方法 使用文本编辑器打开SDK目录下Configure、test/build.info、…

基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度(matlab代码)

目录 1 主要内容 系统结构图 P2G-CCS 耦合模型 系统掺氢分析 其他算例对比 2 部分代码 3 下载链接 1 主要内容 该程序复现《基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度》模型&#xff0c;以碳交易和碳封存成本、燃煤机组启停和煤耗成本、弃风成本、购…

【分治算法】【Python实现】棋盘覆盖

文章目录 [toc]问题描述分治算法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;分治算法 学习指南&#xff1a;Python学习指南 问题描述 在一个 2 k 2 k 2^{k} \times 2^{k} 2k2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&…

ollama集成open-webui本地部署大模型应用

文章目录 概述安装ollama运行指定模型命令帮助docker 安装 webuiWebUI与ollama在同一台机器WebUI与ollama不在同一台机器(推荐)更新open-webui离线安装open-webui使用验证访问导入模型文件参考资料概述 ollama是一款在本地启动并运行大型语言模型的工具,主要功能是在 Docke…

华为鸿蒙应用--封装通用标题栏:CommonTitleBar(鸿蒙工具)-ArkTs

0、效果图 自定义通用标题栏 支持左、中、右常规标题栏设置&#xff1b; 支持自定义视图&#xff1b; 支持搜索功能 一、CommTitleBar代码 import router from ohos.router; import { Constants } from ../../constants/Constants; import { StyleConstants } from ../../…

【LeetCode:1103. 分糖果 II + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(难度⭐⭐)(65)

1. 题目解析 题目链接&#xff1a;78. 子集 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路详解&#xff1a; 为了生成数组 nums 的所有子集&#xff0c;我们需要对数组中的每个元素进行“选择”或“不选择…

如何修改php版本

我使用的Hostease的Windows虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机&#xff0c;但是没有找到切换PHP以及查看PHP有哪些版本的位置&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现在Plesk面板上找到此切换PHP版本的按钮…

路由相关内容

路由相关 1. 路由&#xff08;Routing&#xff09;1.1 直连路由1.2 静态路由1.3 默认路由1.4 动态路由 2. 路由器&#xff08;AR&#xff09;2.1 路由器的工作原理2.1 路由器转发数据包的过程 3. linux中的路由相关操作3.1 route1. 查看路由表2. 三种路由类型说明3. 配置路由ro…

Spring Security中@PermitAll与@PreAuthorize的详解

在使用Spring Security构建安全的应用程序时&#xff0c;经常会涉及到对特定API或方法的访问控制。这时&#xff0c;PermitAll和PreAuthorize这两个注解就发挥了重要作用。本文将详细解释这两个注解的使用方法和它们之间的区别&#xff0c;使即便是初学者也能理解并正确应用它们…

Android 组件提供的状态保存(saveInstanceState)与恢复(restoreInstanceState)

在Android的组件Activity中&#xff0c;有这样一对方法: onSaveInstanceeState 和 onRestoreInstanceState 这两对方法&#xff0c;可以让我在Activiy被异常销毁时&#xff0c;保存状态&#xff1b;以及在Activity重建时&#xff0c;恢复状态。 比如&#xff1a;当我们在输入…

解决在服务器中减少删除大文件夹耗时太久的问题

在数据驱动的现代商业环境中&#xff0c;企业对服务器的高效运作有着极高的依赖性。然而&#xff0c;IT管理员们常常面临一个棘手的问题&#xff1a;删除服务器上的大型文件夹过程缓慢&#xff0c;这不仅降低了工作效率&#xff0c;还可能对用户体验造成负面影响。本文将介绍一…

【Go】关闭通道 用例展示

目录 代码实例 关闭通道的逻辑 如何安全地关闭通道 使用 more 变量判断通道状态 结束工作的通知 通道关闭后的行为 示例一&#xff1a;任务分发和完成通知 示例二&#xff1a;生成者-消费者模式 在 Go 语言中&#xff0c;close 函数用于关闭一个通道&#xff0c;表明没…

c++11新增数组 -- array

概述: array是c11新增的静态数组类型&#xff0c;数组我们平时使用的很多&#xff0c;那为什么在c11增加一个array静态数组的类呢? array的提出可以完全代替我们平时使用的数组&#xff0c;而且其具有更高的安全性&#xff0c;而且使用array表示数组&#xff0c;我们不需要在使…