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

【C++】STL学习之旅——初识STL,认识string类

在这里插入图片描述

string类

  • 1 STL 简介
  • 2 STL怎么学习
  • 3 STL缺陷
  • 4 string
    • 4.1 初识 string
    • 4.2 初步使用
      • 构造函数
      • 成员函数
  • 5 小试牛刀
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1 STL 简介

现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽。接下来我们先来介绍一下STL:

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。 STL 最初由惠普实验室开发,于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分。

主要分为这几个版本:HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等
其中我们需要重点学习的是SGI版本:
SGI版本由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。学习STL 要阅读部分源代码,主要参考的就是这个版本

2 STL怎么学习

网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。那么我们应该如何学习呢?
首先就是关注官方网站 C++中查阅资料。我推荐使用这个:C++库
然后 学好英语很重要,要学会阅读文档,无论学习什么新技术,英语绝对是必不可少的。(程序员的尽头是英语
在这里插入图片描述

3 STL缺陷

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

4 string

接下来让我们开始学习string类吧:

4.1 初识 string

根据上面我们进行的搜索我们可以了解到 :

  1. string是一个代表字符串的对象。
  2. 标准string类提供了类似标准字符容器的接口,而且添加了单字节操作的特性。
  3. string类 是 basic_string类模版的一个实例,使用char类型来实例化basic_string 模版类。
  4. 注意这个类独立于所使用的编码来处理字节: 如果使用 multi-byte 或 多长度字符(例如UTF-8编码),这个类的所有成员(比如 长度和大小),以及该类的迭代器将仍然在该字节(而不是实际的编码字符)来操作。

可以总结为以下内容:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列

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

4.2 初步使用

构造函数

构造函数功能
string() (重点构造空的string类对象,即空字符串
string(const char* s) (重点用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) (重点拷贝构造函数

来看使用效果:

#include<string>
#include<iostream>
using namespace std;int main() {string s1;string s2("Hello!");string s3(5,'n');string s4(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;return 0;
}

流操作符也在string类中进行了重载,输出很丝滑~
在这里插入图片描述

成员函数

成员函数作用
begin()返回字符首位置 (迭代器常用 )
end()返回字符结尾 (迭代器常用)
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

来使用一下:

#include<string>
#include<iostream>
using namespace std;int main() {string s1("Hello!");cout << s1 << endl;//有效字符长度cout <<"有效字符长度:" << s1.size() << endl;//字符串所占空间cout << "字符串所占空间:" << s1.capacity() << endl;//实际长度(不包括‘\0')cout << "实际长度:" << s1.length() << endl;//检查是否为空 (为空返回1 不为空返回0)cout <<"是否为空:" << s1.empty() << endl;//-----------清空试试-------cout << "\n---------清空--------\n";s1.clear();cout << s1 << endl;//有效字符长度cout << "有效字符长度:" << s1.size() << endl;//字符串所占空间cout << "字符串所占空间:" << s1.capacity() << endl;//实际长度(不包括‘\0')cout << "实际长度:" << s1.length() << endl;//检查是否为空 (为空返回1 不为空返回0)cout << "是否为空:" << s1.empty() << endl;//--------更改大小-------cout << "\n---------更改有效字符个数--------\n";s1.resize(10, 'a');cout << s1 << endl;//有效字符长度cout << "有效字符长度:" << s1.size() << endl;//字符串所占空间cout << "字符串所占空间:" << s1.capacity() << endl;//实际长度(不包括‘\0')cout << "实际长度:" << s1.length() << endl;//检查是否为空 (为空返回1 不为空返回0)cout << "是否为空:" << s1.empty() << endl;return 0;
}

看看运行效果:
在这里插入图片描述
这样,对string就有了一个大概了解。
有些注意事项:

  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不会改变容量大小

5 小试牛刀

家人们! 上链接!!!:字符串相加
在这里插入图片描述
我们来尝试使用我们刚刚学习的string来解决问题:
首先:我们不能简单的进行字符串转换为整数,然后相加,最后转换为字符串。你问我为什么?
请看VCR:
在这里插入图片描述
测试用例没问题,但是Leetcode给我们的数据太大了,longlong都没办法容纳。
所以我们使用最朴素的算法:竖式算法
很简单 依次相加 按运算法则进位 得到该位的数值然后插入到string即可。

class Solution {
public:string addStrings(string num1, string num2) {// 从个位开始,所以取字符串末位int i = num1.length() - 1;int j = num2.length() - 1;// 计算所需变量int n1 = 0,n2 = 0 ,carry = 0;//答案string对象string ans = "";//开始计算while(i >= 0 || j >= 0 || carry != 0 ){//这里一定要写判断,不然会发生数组越界。n1 = i >= 0 ? num1[i] - '0' : 0; n2 = j >= 0 ? num2[j] - '0' : 0;//得到结构就尾插ans.push_back((n1 + n2 + carry) % 10 + '0');//迭代carry = (n1 + n2 + carry) / 10;i--;j--;}//注意因为我们是尾插的,所以要调换头尾顺序才可以//这里使用 对称对调法。for(int k = 0 ;k<ans.size()/2;k++){char tmp = ans[k] ;ans[k] = ans[ans.size() - 1 - k];ans[ans.size() - 1 - k] = tmp;}//这个函数更方便,但是不方便解释了在这里//reverse(ans.begin(),ans.end());return ans;}
};

来看效果奥:
在这里插入图片描述

牛批!!!!! 过啦!!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

相关文章:

【C++】STL学习之旅——初识STL,认识string类

string类 1 STL 简介2 STL怎么学习3 STL缺陷4 string4.1 初识 string4.2 初步使用构造函数成员函数 5 小试牛刀Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 STL 简介 …...

Java学习笔记002——类的修饰符

在Java语言中&#xff0c;类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符&#xff0c;在创建类时用于类的声明&#xff1a; 1、public: 当一个类被声明为public时&#xff0c;它可以从任何其他类中被访问&#xff0c;无论这些类位于哪个包中。通常&am…...

华为交换机常见命令总结

文章目录 查看MAC地址清除MAC地址修改MAC地址的老化时间查询STP信息查询接口与vlan的信息 查看MAC地址 查看所有MAC地址表项 display mac-address 查看静态MAC地址表项 display mac-address static //会把动态的过滤掉 查看动态MAC地址表项 display mac-address dynamic //会…...

Android 签名机制

V1是内部文件单个签 但是增加apk文件目录下面随意增加文件并不会有影响,它只关心meta-info文件 mf汇总清单的各个文件sha256 V2 整个APK文件,按文件进行hash 那么便不能随便在这里面增加文件了,增加了签名分块&#xff08;不然签名信息存哪里&#xff09;这里涉及一个文件概念 …...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Scroll容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Scroll容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Scroll容器组件 可滚动的容器组件&#xff0c;当子组件的布局尺寸超过父组件…...

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况&#xff0c;大部人都要配置为外部高速时钟 另外&#xff0c;本实验使用了FreeRTOS&#xff0c;FreeRTOS的时基使用的是Systick&#xff0c;而 STM32CubeMX中默认的HAL库时基也是Systick&#xff0c;为了避免可能的冲突&#xff0c;最…...

6. 使用 Spring Boot进行开发(Developing with Spring Boot)

6. 使用 Spring Boot进行开发&#xff08;Developing with Spring Boot&#xff09; 本节详细介绍了如何使用Spring Boot。它涵盖考虑构建系统、自动配置以及如何运行应用程序等主题。我们还介绍一些 Spring Boot 最新做法。虽然 Spring Boot 没有什么特别之处&#xff08;它只…...

IP地址工具,判断IP是否在指定范围内(支持ipv6)

常用方法&#xff0c;判断一个ip是否在指定的ip范围内&#xff0c;范围可能包括起始ip范围或者掩码形式&#xff0c;无其它依赖&#xff0c; package com.yk.ip;import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; import jav…...

Redis 之六:Redis 的哨兵模式(Sentinel)

Redis 哨兵&#xff08;Sentinel&#xff09;模式是一种高可用性解决方案&#xff0c;用于监控和自动故障转移的集群系统。 在 Redis Sentinel 架构中&#xff0c;哨兵是一组运行在特殊模式下的 Redis 进程&#xff0c;它们可以监控一个或多个主从复制结构中的 Redis 主服务器以…...

总线要点笔记

1. AXI/AHB/APB差异 AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构 AHB (Advanced High-performance Bus) 高级高性能总线 ASB (Advanced System Bus) 高级系统总线 APB (Advanced Peripheral Bus) 高级外围总线 AXI (Advanced eXtensible Interface) …...

RK3566 linux iperf网络测试

一、开发环境 系统:buildroot&#xff1b; 在Linux目标板和Windows PC上运行iperf进行测试&#xff1b; 二、调试 1、查询目标板上的iperf 使用终端助手连接目标板&#xff0c;然后输入命令查询iperf的版本&#xff1a; rootrk3566-buildroot:~# iperf -v iperf version …...

【无标题】计算机主要应用于哪些领域

科学计算&#xff08;或称为数值计算&#xff09;、数据处理&#xff08;信息管理&#xff09;、辅助工程、生产自动化、人工智能。1、科学计算&#xff08;或称为数值计算&#xff09;&#xff1a;早期的计算机主要用于科学计算。目前&#xff0c;科学计算仍然是计算机应用的一…...

力扣精选算法100道——颜色分类(双指针和三指针俩种方法解决此题)

目录 &#x1f6a9;了解题意 &#x1f6a9;算法分析 第一种方法&#xff1a;双指针 &#x1f6a9;代码实现一 第二种方法&#xff1a;三指针 &#x1f6a9;代码实现二 &#x1f6a9;了解题意 本题将整数0&#xff0c;1&#xff0c;2代表红白篮&#xff0c;nums中的整数并…...

基于Java SSM springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java SSM springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐…...

01——什么是人工智能

学习形式分类 1) 有监督学习 有监督学习&#xff08;supervised learning&#xff09;&#xff0c;需要你事先需要准备好要输入数据&#xff08;训练样本&#xff09;与真实的输出结果&#xff08;参考答案)&#xff0c;然后通过计算机的学习得到一个预测模型&#xff0c;再用…...

AI国漫女神这样画!傻瓜式的云端SD(stable diffusion)部署教程 - 白嫖4090、无需代码、一键启动

一、前言&#xff1a;为什么要云端部署stable diffusion? 前段时间一直在用midjourney进行Ai绘画&#xff0c;但是发现Midjourney绘画的限制有点多很死板&#xff0c;很多图都不能画&#xff0c;懂得都懂。想使用Midjourney可以看这个&#xff1a;&#xff08; 【推荐】Midjo…...

消息队列、共享内存、信号灯

IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09; 常用的 IPC 对象包括管道&#xff08;pipe&#xff09;、消息队列&#xff08;message queue&#xff09;、信号量&#xff08;semaphore&#xff09;和共享内存&#xff08;shared memory&…...

K次取反后最大化的数组和 加油站 分发糖果 柠檬水找零

1005.K次取反后最大化的数组和 力扣题目链接(opens new window) 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&a…...

Standoff: 独特的基于真实商业基础架构的网络战

Standoff 网络战通常每年进行两次&#xff08;5 月和 11 月&#xff09;。该公共活动的核心是由多个良心黑客团队&#xff08;也称为威胁研究团队、白帽队或红队&#xff09;对虚拟地区的基础架构进行系列攻击。 下一届 Standoff 将在 2024 年 5 月 23 日至 26 日举行的 Posi…...

如何成为fpga工程师

FPGA的应用领域非常的广&#xff0c;尤其再人工智能&#xff0c;大数据&#xff0c;云计算等等方向非常吃香。加上国家这两年的政策支持&#xff0c;整个芯片行业相比较其他的传统行业来说会好很多&#xff0c;总之前景是光明的&#xff0c;道路是曲折的&#xff0c;想要在人才…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...