当前位置: 首页 > news >正文

【C++干货铺】STL简述 | string类的使用指南

=========================================================================

个人主页点击直达:小白不是程序媛

C++系列专栏:C++干货铺

代码仓库:Gitee

=========================================================================

目录

什么是STL

STL的版本

STL的六大组件

STL的缺陷

string类

C语言中的字符串

标准库中的string类

string类常用的接口使用指南

string类中常见的构造

string类对象的访问及遍历操作

string类对象的容量操作 

 string类对象空间的开辟规则

string类对象的修改操作

尾插、append、+=重载 

assign

insert、erase

rfind、substr

三个有趣的迭代器

逆置迭代器

静态迭代器 

静态逆置迭代器


什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架


STL的版本

  • 原始版本

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。

  • P.J.版本

由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。

  • RW版本

由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

  • SGI版本

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


STL的六大组件

  • 容器:各种数据结构,如vector,list,deque,set,map等用来存放数据
  • 算法:各种常用算法,如sort,find,copy,for_each等
  • 迭代器:扮演了容器与算法之间的胶合剂
  • 仿函数:行为类似函数,可作为算法的某种策略
  • 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
  • 空间适配器:负责空间的配置与管理

STL的缺陷

1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。
2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。 


string类

为什么我们要深入学习剖析string类呢?

C语言中的字符串

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象编程与面向过程)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

标准库中的string类

1. 字符串是表示字符序列的类
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。 

总结

1. string是表示字符串的字符串类

2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

3. string在底层实际是:

basic_string模板类的别名,typedefbasic_string<char,char_traits,allocator>string;

4. 不能操作多字节或者变长字符的序列。

在使用string类时,必须包含#include头文件以及using namespace std;


string类常用的接口使用指南

string类中常见的构造

函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char* s)用常量字符串来构造string类对象
string(const string& s)拷贝构造函数
void string_test1()
{//空类调用构造函数string s1;//调用构造函数string s2 ( "hello word");//调用拷贝构造函数string s3(s2);cin >> s1;cout << "s1:" << s1 << endl;cout << "s2:"<<s2 << endl;cout << "s3:"<<s3 << endl;
}

 


string类对象的访问及遍历操作

函数名称                                           功能说明
operator[ ]返回pos位置的字符,const string类对象的调用
begin + endbegin获取第一个字符的迭代器+end获取下一个位置的迭代器
rbegin +rend 

rbegin获取最后一个字符的反向迭代器+rend获取第一个字符迭代器

范围for循环

C++11简洁的范围for循环新的遍历方式

//[]操作符重载遍历string s1("hello word");int i = 0;//遍历读for (int i = 0; i < s1.size(); i++){cout << s1[i] << " "  ;}cout << endl;//遍历写for (int i = 0; i < s1.size(); i++){s1[i]++;cout << s1[i] << " ";}cout << endl;//迭代器遍历string s2("hello word");//迭代器读string::iterator it = s2.begin();while (it != s2.end()){cout << *it<<" ";it++;}cout << endl;//迭代器写string::iterator it1 = s2.begin();//不可以写成while(it1<s2.end())//有可能不连续 while (it1 != s2.end()){*it1 = 'a';cout << *it1 << " ";it1++;}cout << endl;//范围for循环遍历//范围for循环读string s3("hello word");for (auto ch : s3){cout << ch << " ";}cout << endl;//范围for循环写for (auto& ch : s3){ch++;cout << ch << " ";}cout << endl;

 


string类对象的容量操作 

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效长度
capacity返回空间总大小
clear清空有效字符
reserve

为字符串预留空间

resize将有效字符的个数改成n个,多出的空间用字符c填充

 

	string s1("hello word");//这里size和length成员函数返回的都是字符串的长度cout << s1.size() << endl;cout << s1.length() << endl;cout << s1.capacity() << endl;s1.clear();cout << s1.capacity() << endl;

 

    string s1("hello word");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(13);//添加\0cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(20, 'x');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(5);//拿取前5个字符cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;string s2;s2.resize(10, '#');cout << s2 << endl;cout << s2.size() << endl;cout << s2.capacity() << endl;s2[0]++;cout << s2 << endl;s2.at(0)++;cout << s2 << endl;

 

 string类对象空间的开辟规则

	string s;s.reserve(100);int old = s.capacity();cout << "初始:" << old << endl;for (int i = 0; i < 100; i++){//尾插s.push_back('x');if (s.capacity() != old){cout << "容量:" << s.capacity() << endl;old = s.capacity();}}s.reserve(10);cout << s.capacity() << endl;

首先在vs集成开发环境下会在我们的要求下多开辟空间。

 

在vs集成开发环境下刚开始会以1倍开辟空间,最后变成以1.5倍开辟空间。

注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。


string类对象的修改操作

函数名称功能说明
push_back尾插一个字符
append追加一个字符串
operator+=追加一个字符串
assign从pos位置开始的n个字符覆盖到另一个字符串
insert在pos位置插入n个字符
erase删除pos位置往后的值
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始往前找字符c,截取n个字符,然会将其返回

尾插、append、+=重载 

	string ss("world");string s;//尾插 一个字符s.push_back('#');cout << s << endl;//尾插一个字符串s.append("hello");cout << s << endl;//+=重载s += '#';s += "hello";cout << s << endl;s.append(ss);cout << endl;

 

assign

	string str("xxxxxxx");string base = "The quick brown fox jumps over a lazy dog.";str.assign(base);//覆盖cout << str << endl;//从第5个字符开始的10个字符覆盖过去str.assign(base, 5, 10);cout << str << endl;

insert、erase

	//在pos位置插入n个字符string str("hello world");str.insert(0,1, 'x');cout << str << endl;str.insert(str.begin(), 'x');cout << str << endl;//删除pos位置往后的值str.erase(5);cout << str << endl;

rfind、substr

	string s1("test.cpp");int i = s1.rfind('.');cout << s1.substr(i) << endl;

 

注意:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。 


三个有趣的迭代器

逆置迭代器

在C语言的学习中我们会碰到逆置这到题目,但是在C++中的string类里就含有这个成员函数

	string s4("hello word");//string::reverse_iterator itr = s4.rbegin();auto itr = s4.rbegin();while (itr != s4.rend()){cout << *itr << " ";itr++;}

 

这里就可以体现出auto关键字的作用。 

静态迭代器 

	const string s1("hello word");string::const_iterator cit = s1.cbegin();while (cit != s1.cend()){//读cout << *cit << " ";++cit;//不支持写}

 

静态逆置迭代器

	const string s1("hello word");string::const_reverse_iterator crt = s1.crbegin();auto crt = s1.crbegin();while (crt != s1.crend()){cout << *crt << " ";crt++;}

 


今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力! 

下篇预告——string的模拟实现。

相关文章:

【C++干货铺】STL简述 | string类的使用指南

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 什么是STL STL的版本 STL的六大组件 STL的缺陷 string类 C语言中的字符串 标准库中的string类 string类常用的接口使用指南 string类中常见的构造 strin…...

合肥工业大学数字逻辑实验三

** 数字逻辑 实验报告** ✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!…...

【mmrotate】*** is not in the task util registry

问题&#xff1a; 使用mmrotate-1.x 自定义类时&#xff0c;明明已经注册&#xff0c;并添加到__init__.py中&#xff0c;但提示没有注册 from mmdet.registry import MODELSMODELS.register_module() class RotatedATSSAssigner(BaseAssigner): 分析&#xff1a; 具体看提…...

使用bitmap实现可回收自增id

需求描述 设计一个方法&#xff0c;每次调用返回一个自增id&#xff0c;同时需要满足以下要求。 可更新id的状态为已使用&#xff0c;已使用的id下次调用时不再返回可修改某个id的状态为未使用&#xff0c;下次调用时设为未使用状态的id可重新被返回 思路 思路一&#xff1…...

0基础学习VR全景平台篇第118篇:利用动作录制器功能避免重复操作 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好。欢迎收看蛙色VR系列教程之PS利用动作记录器节约补地时间。 大家拍摄在补地的时候&#xff0c;利用插件选择输入输出选项的时候&#xff0c;每次重复操作…...

大数据Doris(十九):数据导入(Load)

文章目录 数据导入(Load) 一、Broker load 二、Stream load 三、Insert 四、Multi load...

BP神经网络的数据分类——语音特征信号分类

大家好&#xff0c;我是带我去滑雪&#xff01; BP神经网络&#xff0c;也称为反向传播神经网络&#xff0c;是一种常用于分类和回归任务的人工神经网络&#xff08;ANN&#xff09;类型。它是一种前馈神经网络&#xff0c;通常包括输入层、一个或多个隐藏层和输出层。BP神经网…...

基于SSM+Vue的随心淘网管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

大语言模型的关键技术(二)

一、Transformer 语言模型存在明显的扩展效应&#xff1a; 更大的模型/数据规模和更多的训练计算通常会导致模型能力的提升。 1、扩展效应的原因&#xff1a; 模型规模&#xff1a;增加模型的规模&#xff0c;即增加模型的参数数量和层数&#xff0c;通常会提高模型的表示能力…...

世界互联网大会领先科技奖发布 百度知识增强大语言模型关键技术获奖

11月8日&#xff0c;2023年世界互联网大会乌镇峰会正式开幕&#xff0c;今年是乌镇峰会举办的第十年&#xff0c;本次峰会的主题为“建设包容、普惠、有韧性的数字世界——携手构建网络空间命运共同体”。 目录 百度知识增强大语言模型关键技术荣获“世界互联网大会领先科技奖”…...

2023.11.09 homework (2)

【七年级上数学】 教别人也是教自己&#xff0c;总结下&#xff1a; 13&#xff09;找规律的题目&#xff0c;累加题目&#xff0c;要整体看&#xff0c;不然不容易算出来&#xff0c;求最大值&#xff0c;那么就是【最大值集群和】减去【最小集群和】就是最大值 9-12&#x…...

ARMday01(计算机理论、ARM理论)

计算机理论 计算机组成 输入设备、输出设备、运算器、控制器、存储器 1.输入设备&#xff1a;将编写好的软件代码以及相关的数据输送到计算机中&#xff0c;转换成计算机能够识别、处理和存储的数据形式 键盘、鼠标、手柄、扫描仪、 2.输出设备&#xff1a;将计算机处理好的数…...

C#中通过LINQtoXML加载、创建、保存、遍历XML和修改XML树

目录 一、加载、创建、保存、遍历XML 1.加载XML &#xff08;1&#xff09;从已有文件加载XML &#xff08;2&#xff09;从字符串加载XML 2.创建并保存XML 3.遍历XML 4.示例源码 5.运行 二、修改XML的树 1.添加节点 2.删除 3.更新 4.示例源码 5.运行效果 三、…...

进程管理(二)

进程并发制约关系及临界区 (3)比如A的n为MAX,此时B执行buf[Max]出错。 临界区是访问临界资源的代码。 par并发执行 进程同步机制准则 让权等待:主动让位 进程互斥访问临界资源的软件解决方案 算法1——设置访问编号 no_op是空指令,做空操作,空转指令。no_op依然会占…...

数字图像处理 基于numpy库的傅里叶变换

一、傅里叶变换 图像可以用两个域表示:空间域和频域。空间域是图像最常见的表示形式,其中像素值表示图像中每个点的亮度或颜色。另一方面,频域将图像表示为不同频率和幅度的正弦波的集合。 傅里叶变换(一种图像处理中使用的数学技术)可以通过分析图像的频率分量并揭示隐藏…...

scrapy案例教程

文章目录 1 scrapy简介2 创建项目3 自定义初始化请求url4 定义item5 定义管道 1 scrapy简介 scrapy常用命令 |命令 | 格式 |说明| |–|–|–| |startproject |scrapy startproject <项目名> |创建一个新项目| |genspider| scrapy genspider <爬虫文件名> <域名…...

1-3 docker 安装 prometheus

一、环境 1、环境准备 安装Docker 镜像加速 安装 docker 检查版本 安装Docker-compose 二、Docker-compose 安装 Prometheus 1、【方式一】手动创建 docker-compose 和 配置文件 创建prometheus监控的文件夹 创建alertmanager的配置文件 - config.yml 新建grafana的…...

Mac使用brew搭建kafka集群

1. 第一步&#xff1a;单机搭建 单机搭建&#xff1a; 安装完后&#xff0c;默认自动安装对应版本zookeeper brew install kafka2.第二步&#xff1a;修改配置文件: 配置3个Kafka 第一个&#xff08;使用默认配置&#xff09; vi /opt/homebrew/etc/kafka/server.propertie…...

图形界面应用案例——关灯游戏(以及扩展)(python)

7.8 图形界面应用案例——关灯游戏 题目: [案例]游戏初步——关灯游戏。 关灯游戏是很有意思的益智游戏,玩家通过单击关掉(或打开)一盏灯。如果关(掉(或打开)一个电灯,其周围(上下左右)的电灯也会触及开关,成功地关掉所有电灯即可过关。 图7-43 关灯游戏运行效…...

Android平台上执行C/C++可执行程序,linux系统编程开发,NDK开发前奏。

Android平台上执行C/C可执行程序&#xff0c;linux系统编程开发&#xff0c;NDK开发前奏准备。 1.下载NDK&#xff0c;搭建NDK开发环境 下载地址 https://developer.android.com/ndk/downloads 下载过程中点击下面箭头的地方&#xff0c;点击鼠标右键&#xff0c;复制好下载…...

【C语言】C语言经典小游戏:贪吃蛇(上)

文章目录 一、游戏背景及其功能二、Win32 API介绍1、Win32 API2、控制台程序3、定位坐标&#xff08;COORD&#xff09;4、获得句柄&#xff08;GetStdHandle&#xff09;5、获得光标属性&#xff08;GetConsoleCursorInfo&#xff09;1&#xff09;描述光标属性&#xff08;CO…...

20250606-C#知识:匿名函数、Lambda表达式与闭包

C#知识&#xff1a;匿名方法、Lambda表达式与闭包 闭包乍一听感觉很复杂&#xff0c;其实一点也不简单 1、匿名方法 没有方法名的方法一般用于委托和事件 Func<int, int, int> myAction delegate(int a, int b) { return a b; }; Console.WriteLine( myAction(1, 2)…...

C++.OpenGL (11/64)材质(Materials)

材质(Materials) 真实感材质系统 #mermaid-svg-NjBjrmlcpHupHCFQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NjBjrmlcpHupHCFQ .error-icon{fill:#552222;}#mermaid-svg-NjBjrmlcpHupHCFQ .error-text{fill:…...

python训练营day45

知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensorbo…...

Python打卡训练营day46——2025.06.06

知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力后的特征图和热力图 …...

前端面试准备-7

1.定义class的实现 //定义class class Person{//公有属性nameage 18//构造函数constructor(name){//构造函数内部的this实例化对象this.name name//动态添加属性&#xff08;不推荐&#xff09;this.food [&#x1f402;,&#x1f40e;,&#x1f40f;]}//公有方法sayHi(){c…...

学习经验分享【40】目标检测热力图制作

目标检测热力图在学术论文&#xff08;尤其是计算机视觉、深度学习领域&#xff09;中是重要的可视化分析工具和论证辅助手段&#xff0c;可以给论文加分不少。主要作用一是增强论文的可解释性与说服力&#xff1a;论文中常需解释模型 “如何” 或 “为何” 检测到目标&#xf…...

MidJourney入门学习

1. 引言 MidJourney 是一款由美国科技公司开发的先进文本到图像生成 AI 工具,自 2022 年推出以来迅速在创意产业和社交媒体领域引发轰动。与 Stable Diffusion 不同,MidJourney 以其独特的美学风格、高度细节化的图像生成能力和强大的创意引导功能著称,成为设计师、艺术家和…...

双空间知识蒸馏用于大语言模型

Dual-Space Knowledge Distillation for Large Language Models 发表&#xff1a;EMNLP 2024 机构&#xff1a;Beijing Key Lab of Traffic Data Analysis and Mining 连接&#xff1a;https://aclanthology.org/2024.emnlp-main.1010.pdf 代码&#xff1a;GitHub - songmz…...

CSS 3D 变换中z-index失效问题

CSS 3D 变换中 z-index 失效问题 1. z-index 失效了 在 CSS 中&#xff0c;z-index 通常用于控制元素的层叠顺序&#xff0c;数值越大&#xff0c;元素越靠前显示。在 3D 变换&#xff08;如 rotateX、translateZ&#xff09; 中使用 z-index 时&#xff0c;可能会发现z-inde…...