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

C++学习记录——십 STL初级认识、标准库string类

文章目录

  • 1、什么是STL
  • 2、STL简介
  • 3、什么是string类
  • 4、string类的常用接口说明
    • 1、常见构造函数
    • 2、容量操作
    • 3、迭代器
    • 4、其他的标准库的string类


关于string类的内容,可以在cplusplus.com查看到。

1、什么是STL

STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2、STL简介

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分为仿函数,算法,容器,迭代器,空间配置器,配接器

3、什么是string类

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

string类则是C++定义的一个类。根据官方文档记录:

  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模板类的别名,typedef basic_string<char, char_traits, allocator>
    string;
  4. 不能操作多字节或者变长字符的序列。
    在使用string类时,必须包含#include头文件以及using namespace std;

简单看一个代码

#include <iostream>
#include <string>
using namespace std;int main()
{string s1;string s2("hello world");for (size_t i = 0; i < s2.size(); ++i){s2[i]++;}cout << s2 << endl;return 0;
}

string需要头文件string,s2[i]++会让对应的字符往后一位,比如h变为i,e变为f。

在这里插入图片描述

4、string类的常用接口说明

1、常见构造函数

string(const char* s) 和上面的代码一样,可以string s2(“hello world”); 也可以string s2 = “hello world”。

string(const string& str, size_t pos, size_t len = npos)。这个构造函数的意思就是取字符串的一部分,从pos位置开始往后len个字符。

	string s3 = "hello world";string s4(s3, 6, 3);

结果是wor。第6个位置是空格,打印空格之后3个位置。如果后面的长度过大,那么就会取到字符串结束,而不是按照实际的len去越界。如果不给len,那么就会按照它的缺省值来打印,len的缺省值是npos,定义中给的值是无符号整数-1,所以就是整数的最大值,那么就会打印到字符串结束。

string(const char* s, size_t n),用字符串前n个进行构造。

	string s5("hello world", 6);cout << s5 << endl;

打印hello和空格。

string(size_t n, char c),用n个字符c来构造。

	string s6(10, '*');cout << s6 << endl;

cplusplus.com可以查到相关文档。

2、容量操作

int main()
{string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;return 0;
}

size和length两个功能一样,返回有效字符串长度。max_size()则是察看能达到的最大值,42亿9千万多,没有多大意义。

capacity(),结果是15,不包含’\0’,返回空间总大小。

int main()
{string s1("hello");s1.push_back('?');s1.append("asda");cout << s1 << endl;return 0;
}

push_back只能加字符,而append可以加字符串。append还有别的用法,在cplusplus.com查看。统合这两个功能,+=就可以全实现。

	s1 += '!';s1 += "asdghjfk";cout << s1 << endl;

在这里插入图片描述

capacity函数,会在原有空间不足时进行自动扩容,这个根据不同的编译器有不同的结果,vs是1.5倍扩容,Linux不一样。

int main()
{string s;cout << sizeof(s) << endl;size_t sz = s.capacity();cout << "make s grow:\n";cout << "capacity changed: " << sz << '\n';for (int i = 0; i < 100; ++i){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << endl;}}
}

也有方法阻止自动扩容,reserve函数,预留空间。

	string s;s.reserve(100);

不一定会多开100空间,但是一定开得比100多。

resize可以开空间并初始化。

int main()
{string s1("hello world");s1.reserve(100);cout << s1.capacity() << endl;cout << s1.size() << endl;string s2("hello world");s2.resize(100);cout << s2.capacity() << endl;cout << s2.size() << endl;return 0;
}

在这里插入图片描述

resize括号里第二个参数可以加上字符,用来初始化空白的空间为指定的字符。resize也可以删除数据,括号的数字n比size小,就会保留前n个,但不会缩小capacity,缩容对于系统来说难度比较大,系统原生一般不支持。

3、迭代器

int main()
{string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";++it;}cout << endl;return 0;
}

分析一下这段代码。我们可以暂且理解为s1指向hello world字符串,s1.begin就是首元素地址,给了it,end则是’\0’的位置,it指向了第一个元素,然后边打印边++。

我们也可以用范围for,不过底层原理都一样,都是迭代器。

	for (auto ch : s1){cout << ch << " ";}cout << endl;

iterator是string类里的typedef的一个函数。用迭代器需要用它。迭代器可以反向使用。

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

反向迭代器需要用到reverse_iterator。rbegin指向hello world的d而不是’\0’,rend则指向h前面的位置,这里正是因为是反向,所以++就等于–。

如果是加上了const

void func(const string& s)
{string::const_iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;
}

如果是const的变量,那么就得用const_iterator,刚才的反向迭代器也一样,需要用专用的,并且rbegin这些也得对应着用。const修饰,就只能遍历和读,而不能写;反向迭代器加上const,类的函数就应当是string::const_reverse_iterator。

4、其他的标准库的string类

	string s1("hello world");s1[100];s1.at(100);

越界了会直接报错,如果是at,则会抛异常,虽然也报错,但可以捕获异常。

insert整体是插入的意思,有很多函数,可以插入string类对象,可以插入字符串,可以选择位置来控制插入。

	string s1("hello world");//s1[100];//s1.at(100);s1.insert(0, "hhhh");cout << s1 << endl;s1.insert(4, 1, ' ');cout << s1 << endl;return 0;

在这里插入图片描述

或者s1.insert(4, " ")这样。括号里也可以加上迭代器。

	s1.insert(s1.begin() + 4, ' ');cout << s1 << endl;
    string s2("hello world");s2.erase(5, 1);//s2.erase(s2.begin() + 5);cout << s2 << endl;

erase可以用来删除

在这里插入图片描述

如果括号里给的数字过大时,那就会有多少删多少。

insert和erase可能存在挪动数据,效率低下,所以不推荐常用。

之前有在字符串空格处把空格换成别的字符的题,现在用C++写

	string s1("hello, the world");size_t pos = s1.find(' ');if (pos != string::npos){s1.replace(pos, 1, "%20");}cout << s1 << endl;return 0;

这里会把第一个空格改成%20,加个循环就可以把所有空格都换上。

	while(pos != string::npos){s1.replace(pos, 1, "%20");pos = s1.find(' ');}

不过这个程序还有改进之处。pos = s1.find(’ ', pos + 3),可以从%20的0处往后开始找下一个空格,增加一点效率。replace存在扩容,会把1个字符扩成3个字符。所以我们可以提前开好,避免replace开空间。

	string s1("hello the world");size_t num = 0;for (auto ch : s1){if (ch == ' ')++num;}s1.reserve(s1.size() + 2 * num);size_t pos = s1.find(' ');while(pos != string::npos){s1.replace(pos, 1, "%20");pos = s1.find(' ', pos + 3);}cout << s1 << endl;

结束。

相关文章:

C++学习记录——십 STL初级认识、标准库string类

文章目录1、什么是STL2、STL简介3、什么是string类4、string类的常用接口说明1、常见构造函数2、容量操作3、迭代器4、其他的标准库的string类关于string类的内容&#xff0c;可以在cplusplus.com查看到。 1、什么是STL STL是C标准库的重要组成部分&#xff0c;不仅是一个可复…...

【redis】redis缓存与数据库的一致性

【redis】redis缓存与数据库的一致性【1】四种同步策略【2】更新缓存还是删除缓存&#xff08;1&#xff09;更新缓存&#xff08;2&#xff09;删除缓存【3】先更新数据库还是先删除缓存&#xff08;1&#xff09;出现失败时候的情况1-先删除缓存&#xff0c;再更新数据库&…...

XCP实战系列介绍12-基于Vector_Davinci工具的XCP配置介绍(一)

本文框架 1.概述2. EcuC配置2.1 Pdu添加步骤2.2 配置项说明3. Can 模块配置4. CanIf 模块配置4.1 接收帧的Hardware Receive Object配置4.2 接收帧和发送帧的Pdu配置1.概述 在文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,在《XCP实战系列介绍01-测量与标定底层逻辑》…...

Unity Material详解

一、创建 二、属性 1.Shader:Unity内置了一些shader&#xff0c;用户自定义的shader也在这里出现. Edit: 可以编辑一些shader可编辑的内容&#xff0c;如一些属性. 2.Rendering Mode:渲染模式 Opaque-不透明-石头适用于所有的不透明的物体Cutout-镂空-破布透明度只有0%和100…...

碰撞检测算法分类

包围形法粗糙检测, 包含以下两种类检测外接圆法轴对齐包围矩形&#xff0c; AABB 碰撞检测算法之包围形法分离轴精细检测 BOX vs PolygonOBBseparating Axis Theorem碰撞检测算法之分离轴定理GJKGJK&#xff08;Gilbert–Johnson–Keerthi&#xff09;, 相比 SAT 算法&#xff…...

代码随想录第十二天(

文章目录232. 用栈实现队列补充知识——Deque232. 用栈实现队列 答案思路&#xff1a; 在push数据的时候&#xff0c;只要数据放进输入栈就好&#xff0c;但在pop的时候&#xff0c;操作就复杂一些&#xff0c;输出栈如果为空&#xff0c;就把进栈数据全部导入进来&#xff0…...

电源模块 DC-DC直流升压正负高压输出12v24v转±110V±150V±220V±250V±300V±600V

特点效率高达80%以上1*2英寸标准封装电源正负双输出稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上应用HRA 1~40W系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36VDC标准&…...

【动画图解】这个值取对了,ViewPager2才能纵享丝滑

前言 在前两篇文章中&#xff0c;我们通过一张张清晰明了的「示意图」&#xff0c;详细地复盘了RecyclerView「缓存复用机制」与「预拉取机制」的工作流程&#xff0c;这种「图解」创作形式也得到了来自不同平台读者们的一致认可。 而从本文开始&#xff0c;我们将正式进入Vi…...

CSDN每日一练:小豚鼠搬家

题目名称&#xff1a;小豚鼠搬家 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述 小豚鼠排排坐。 小艺酱买了一排排格子的小房子n*m&#xff0c;她想让k只小豚鼠每只小豚鼠都有自己的房子。 但是为了不浪费空间&#xff0c;她想要小房子的最外圈尽量每行每列都有…...

Dockerfile命令及实践构建一个网站

dockerfile用于构建docker镜像的&#xff0c;部署一个用于运行你所需的容器环境。相当一个脚本&#xff0c;通过dockerfile自己的指令&#xff0c;来构建软件依赖、文件依赖、存储、定制docker镜像的方式有两种&#xff1a;手动修改容器内容&#xff0c;导出新的镜像基于Docker…...

[VMware]Ubuntu18.04 网络图标消失

Ubuntu 18.04 网络图标消失运行环境问题解决NO.1 执行 sudo systemctl stop network-managerNO.2 执行 sudo rm /var/lib/NetworkManager/NetworkManager.stateNO.3 执行 sudo systemctl start network-managerNO.4 vi /etc/NetworkManager/NetworkManager.confNO.5 执行 sudo …...

国产C2000,P2P替代TMS320F280049C,独立双核32位CPU,主频高达400MHz

一、特性参数 1、独立双核&#xff0c;32位CPU&#xff0c;单核主频400MHz 2、IEEE 754 单精度浮点单元 &#xff08;FPU&#xff09; 3、三角函数单元 &#xff08;TMU&#xff09; 4、1MB 的 FLASH &#xff08;ECC保护&#xff09; 5、1MB 的 SRAM &#xff08;ECC保护&…...

二十五、Gtk4-多线程分析

1 回顾 1.1 Gnome相关 首先回顾一下GLib&#xff0c;GObject&#xff0c;GIO&#xff0c;Gtk的不同&#xff0c;因为下面会涉及到这些概念里面的函数。 所有这些都是由Gnome项目开发的库&#xff0c;一般都用于Gnome环境相关的应用程序。 Gtk&#xff1a;GUI界面库。GLib&a…...

JVM基础学习

JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统&#xff0c;另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区&#xff0c;Native Interface 本地接口Class loader&#xff1a;根据给定的全限定类名来装载class文件到运行时数…...

ASML逆袭史:人、资金、技术,缺一不可

前言 近年来&#xff0c;由于众所周知的原因&#xff0c;荷兰ASML&#xff08;阿斯麦&#xff09;公司的先进半导体制造设备——光刻机&#xff0c;进入普通大众视野&#xff0c;成为人们茶余饭后谈论的焦点话题之一。 1月底&#xff0c;“美日荷三方谈判达成协议&#xff0c;可…...

MongoDB 覆盖索引查询

MongoDB 覆盖索引查询 官方的MongoDB的文档中对覆盖查询做了说明&#xff1a; 所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分&#xff0c; MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询…...

Flink Checkpoint 中的Aligned Checkpoint 和 Unaligned Checkpoint

文章目录知识点反压CheckpointBarrierAligned CheckpointUnaligned Checkpoint核心思想实现原理UC同步阶段UC异步阶段知识点 反压 反压是流式系统中关于处理能力的动态反馈机制&#xff0c;并且是从下游到上游的反馈&#xff0c;一般是在实时数据处理的过程中&#xff0c;上游…...

C++快速入门

本章内容我将结合C语言一起&#xff0c;初步学习了解c&#xff0c;与大家一起快速入门这门语言。当然鉴于c本身属于一门中级语言&#xff0c;大家对编程有一定了解之后来学习这门知识会更加得心应手。简介C 被认为是一种中级语言&#xff0c;它综合了高级语言和低级语言的特点。…...

ubuntu18.04 network有线网络图标缺失解决记录

先按照博客&#xff11;安装驱动   博客&#xff11;链接&#xff1a;Ubuntu安装 Realtek R8125 驱动_Lwang2018的博客-CSDN博客_瑞昱8125 for ubunt 安装完成后&#xff0c;遇到问题&#xff1a;ifconfig -a显示的有线网接口&#xff08;名字以en开头&#xff09;没有ip地址…...

java对象克隆和面向对象的设计原则

java进阶注解内置注解元注解自定义注解对象克隆浅克隆深克隆java设计模式建模语言类之间的关系依赖关系关联关系单向关联双向关联自关联聚合关系组合关系继承关系实现关系面向对象设计原则单一职责开闭原则里氏替换原则依赖倒置接口隔离迪米特原则组合/聚合复用原则注解 java注…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...