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

【从基础到实战】STL string 学习笔记(上)

一、STL简介

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

STL是惠普实验室开发的一系列软件的统称,1994年,在通过C++标准化第一个草案之后,联合标准化委员会投票并通过了将STL包含到C++标准中的提议,它对C++的扩展超出了最初的定义范围,故延迟了C++标准化的进程。

学习STL,我们不免要深层研究底层逻辑,大家平时也可以通过以下网站自主研究:dtkdaReference - C++ Reference (cplusplus.com)

STL有如图六大组件,其中我们今天要学习的string属于容器(也就是我们平时所说的数据结构)

二、string类

2.1string初识

string实际上是basic_string类模板实例化过后一个具体类型。

string事实上是管理字符数组(char)的顺序表,某种程度来说就是我们常说的字符串。由于string是C++创始团队先于STL开始探索的,所以string严格来说不属于STL范畴。

string类一般有这几个版本,主要因编码规则不同而区分,我们最常用为string(常使用utf-8编码规则)

2.2string使用

2.2.1成员函数

我们已知默认成员函数有六个,其中比较重要的为四个。在string中有构造、析构与赋值。


1.构造函数

首先我们来看一下string中的7种构造函数:

※※重点掌握(1)(2)(4)

(1)是默认构造,也就是我们不传参就可以构造;

(2)是用string对象进行拷贝构造;第四个是传一个字符数组进行构造;

(3)构造则是用string对象的一部分,从pos(下标从0开始)开始,长度为len进行构造。

还有有细心的同学会注意到,(3)第三个参数size_t len后面带着一个缺省参数npos,从下图可以看到,npos是string中的一个静态成员变量。

 如果遇到函数参数string太短(len数值太大),那么直接拷贝到字符数组结尾就OK~抑或是用户没有传函数参数,也就是len取缺省值,则也是取到string末尾即可~

当然,在我们进行对象实例化之时一定要记得包头文件#include<string>.

这里要插入一个话题,同学们要理解为什么数组的下标要从0开始。首先,数组元素的访问要转换成指针的访问,也就是

a[0]; -> *(a+0);a[1]; -> *(a+1);

假设我们,从1开始,则访问数组时,直接就向后窜了一位读取,而非原本的地址。


第(5)个构造函数实例:

第(6)个构造函数实例:

看到这里有同学会吐槽,“string这里的语法好冗杂~”,这是因为string出现的很早,编写时还没有经验,发展到如今,由于要顺应每个人的代码习惯,如果删除某些语法,可能某些程序也无法编译通过,所以也就无法删除。

2.赋值重载(了解(1)即可)

应用实例:

2.2.2string遍历与修改

1.下标+【】

 


2.迭代器(所有容器主流遍历+修改的方式) 注意iterator关键字!
 区间:[begin(),end())(这里的 != 竟然变成了 ≠ !!!!)o(╥﹏╥)o~

迭代器的意义:

1.统一类似的方式遍历容器

2.算法脱离具体底层结构,和底层结构解耦

在C++中,字符串的‌past-the-end字符‌是指位于字符串末尾之后的一个虚构位置,用于表示字符串的结束边界。该位置不对应实际字符,主要用于迭代器范围定义。

 现在,我们试图实现一块代码,使得字符串实现逆置:

这时就涉及到了算法(algorithm)#include<algorithm>中的reverse

3.范围for

C++11提供的语法,首先要注意auto这一关键字,他可以帮助自动推导对象类型

若试图让y变为引用,则需在auto后加上&,若不加就是拷贝。

auto会自动取容器中数值赋给ch,自动判断结束,自动迭代。本质上是auto ch = * 迭代器。

要注意,这里无法完成修改,要传引用返回才可接收并修改。还有一点,不一定固定写auto,前面写自己的类型也是可以的(不建议)。

。。未完待续。。点个赞呗~

http://www.dtcms.com/a/305560.html

相关文章:

  • 文心大模型4.5开源:国产AI的破茧时刻与技术普惠实践
  • 梳理Ego-Planner模式下5通道、6通道与无人机模式的关系
  • 我的世界之战争星球 暮色苍茫篇 第二十五章、娜迦,卒
  • 观远 ChatBI 完成 DeepSeek-R1 大模型适配:开启智能数据分析跃升新篇
  • Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
  • 用Python+MySQL实战解锁企业财务数据分析
  • Redis:缓存雪崩、穿透、击穿的技术解析和实战方案
  • 【开源】一款开源、跨平台的.NET WPF 通用权限开发框架 (ABP) ,功能全面、界面美观
  • mybatis中的极易出现错误用法
  • OpenBayes 一周速览丨Self Forcing 实现亚秒级延迟实时流视频生成;边缘AI新秀,LFM2-1.2B采用创新性架构超越传统模型
  • cgroups测试cpu bug
  • 离线录像文件视频AI分析解决方案
  • Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode传递三方FFD到APP流程解析
  • MSPM0开发学习笔记:二维云台画图(2025电赛 附源代码及引脚配置)
  • RHCA学习概述
  • 【音视频】WebRTC-Web 音视频采集与播放
  • Reflect从入门到实战
  • Java面试宝典:MySQL中的系统库
  • vue npm install卡住没反应
  • Three.js 与 React:使用 react-three-fiber 构建声明式 3D 项目
  • 深度学习(鱼书)day06--神经网络的学习(后两节)
  • Apple基础(Xcode①-项目结构解析)
  • Java 笔记 default 使用场景
  • Python 程序设计讲义(44):组合数据类型——集合类型:创建集合
  • 从0到1学PHP(七):PHP 与 HTML 表单:实现数据交互
  • HTML第一次作业
  • html的onBlur
  • VUE -- 基础知识讲解(三)
  • 鹏哥C语言_82_指针_指针数组
  • 简单线性回归模型原理推导(最小二乘法)和案例解析