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

【C++】—掌握STL string类:字符串操作的得力助手

#1024程序员节|征文#
在这里插入图片描述

文章目录

  • 繁星点点映夜空,晨曦微露照前程
    • 1.string的基本概念
    • 2.标准库中的string类
      • 2.1 string类
      • 2.2 auto和范围for
      • 2.3 string类常用的接口
      • 2.4 string类对象的容量操作
      • 2.5 string类对象的访问及遍历操作
      • 2.6 string类对象的修改操作
      • 2.7 string类非成员函数

繁星点点映夜空,晨曦微露照前程

1.string的基本概念

stringSTL(标准模板库)中的字符串类型,用于表示和操作字符串数据。它是一个类,封装了char*字符指针,并管理该字符串的内存分配和释放,用户无需担心内存管理问题。

2.标准库中的string类

2.1 string类

string类的文档介绍

2.2 auto和范围for

auto关键字
auto关键字被用于自动类型推断。意味着编译器会根据初始化表达式来自动确定变量的类型,从而免去了显式指定类型的麻烦。

 •使用场景

简化代码: 当一个变量的类型名称特别冗长或复杂时,使用auto可以使代码更加简介明了。
与范围for结合: 在范围for中,auto关键字是必须的,因为循环变量会被自动推导为容器元素的类型。
避免类型错误: 使用auto可以减少因类型不匹配而导致的编译错误,因为编译器会负责类型推导。

 •注意事项
类型推导规则:auto的类型推导遵循一组特定的规则,这些规则与模板类型推导类似。当在同一行声明多个变量时,这些变量必须是相同类型,否则将会编译报错,实际上编译器只对第一个变量进行推导,然后用推到出来的类型定义其他变量。
不能用于推导数组类型:auto不能用于推导数组类型。如果尝试用auto来声明一个数组变量,编译器会报错。
auto不能作为函数的参数: auto不能作为函数的参数,但可以作返回值,但需要谨慎使用。
➍**auto声明指针类型:**用auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加&

#include<iostream>
using namespace std;int func1()
{return 10;
}void func2(auto a)//不能做参数
{}auto func3()//可以做返回值,但是需谨慎使用
{return 3}int main()
{int a = 10;auto b = a;auto c = 'a';auto d = func1();auto e;//编译报错:‘e’:类型包含“auto”的符号必须具有初始化值的设定项auto aa = 1, bb = 2;auto cc = 3, dd = 4.0;//编译报错:在声明符列表中,“auto”必须始终推导为同一类型auto array[] = {4,5,6};//编译报错:数组不能具有其中包含“auto”的元素类型return 0;
}

范围for
范围for循环(Range-based for loop)是一种简化的for循环语法,它允许我们遍历容器(比如数组,向量vector,列表list等)或其他序列类型中的所有元素,而无需使用迭代器或下边。
范围for的基础语法如下:

for(auto element : container)

其中,element是循环中每次迭代时的当前元素,container是要遍历的容器或者序列。auto关键字用于自动类型推导,编译器会根据container中的元素类型来推导element的类型。
例子:
1.遍历数组:

int arr[] = {12345}for(auto e : arr)
{std::cout << e << " ";
}
//输出:1 2 3 4 5

2.遍历向量(vector)

std::vector<std::string> vec = {"hello", "world!"};
for(auto str : vec)
{std::cout << str << " ";
}
//输出:hello world!

2.3 string类常用的接口

1.string对象的常见构造

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

 •默认构造函数
原型:string()
**说明:**构造一个空字符串
示例:

#include<iostream>
#include<string>
using namespace std;int main()
{string s1;cout << "默认构造函数构造的字符串s1:" << s1 << endl;cout << "字符串长度:" << s1.size() << endl;return 0;
}

输出结果为空字符串,且长度为0.
 •C字符串构造函数
原型:string(const char * s)
说明: 用C风格字符串s(以’\0’结束的字符序列)来构造新的字符串。
示例:

#include<iostream>
#include<string>
using namespace std;int main()
{string s2("abcdef");cout << "C字符串构造函数构造的字符串s2:" << s2 << endl;cout << "字符串长度:" << s2.size() << endl;return 0;
}

输出结果为C风格字符串的内容,且长度与C风格字符串相同
 •填充构造函数
原型:string(size_t n,char c)
说明: 创建一个包含n个字符c的新字符串
示例:

#include<iostream>
#include<string>
using namespace std;int main()
{string s3(6,'a');cout << "C字符串构造函数构造的字符串s3:" << s3 << endl;cout << "字符串长度:" << s3.size() << endl;return 0;
}

输出结果为6个a的字符串
 •拷贝构造函数
原型:string(const string& str)
说明: 构建一个复制的结构,即创建一个新的字符串对象,其内容与给定的字符串对象str相同。
示例:

#include<iostream>
#include<string>
using namespace std;int main()
{string s0 = "abcdefgh";string s4(s0);cout << "C字符串构造函数构造的字符串s4:" << s4 << endl;cout << "字符串长度:" << s4.size() << endl;return 0;
}

输出结果为原字符串,且长度与原字符串相同。

2.4 string类对象的容量操作

函数名称功能说明
size返回字符串有效字符的长度
length返回字符串有效字符的长度
capacity返回空间总大小
empty检测字符串释放为空串,是返回ture,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数改为n个,多出的空间用字符c填充

❗️注意:
 •size()length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下都使用size()
 •clear()只是将string中的有效字符清空,不改变底层空间大小。
 •resze(size_t n)resize(size_t n ,char c)都是将字符串中有效字符的个数改变到n个,不同的是当有效字符的个数增多时:resize(size_t n)是用0来填充多余的元素空间,而resize(size_t n,char c)是用字符c来填充多余的空间。resize在改变元素个数使,如果是将元素个数增多,可能会改变底层容量空间的大小,如果是将元素个数减少,底层空间总大小不变。
 •reserve(size_t res_arg=0):为string 预留空间,不改变有效元素个数,当reserve的参数小于底层空间总的大小时,reserve 不会改变容量的大小。

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

函数名称功能说明
operator[]返回pos位置的字符
begin返回一个指向字符串第一个字符的迭代器。
end返回一个指向字符串末尾后的字符的迭代器。
rbegin返回一个指向字符串最后一个字符的反向迭代器(即它的反向开头)。
rend返回一个反向迭代器,指向字符串第一个字符前面的理论元素(被认为是字符串的反向结束)。
范围forfor的新型遍历方式

2.6 string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回c格式字符串
find+npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从后向前查找字符c
substr在str中从pos位置开始,截取n个字符,然后将其返回

❗️注意:
 •在string尾部追加字符时,s.push_back /s.append/s.+='c’三种的实现方式差不多,一般情况下string 类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
 •对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留。

2.7 string类非成员函数

函数名称功能说明
operator+连接字符串(尽量少用,因为传值返回,导致深拷贝,效率降低)
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较

相关文章:

【C++】—掌握STL string类:字符串操作的得力助手

#1024程序员节&#xff5c;征文# 文章目录 繁星点点映夜空&#xff0c;晨曦微露照前程1.string的基本概念2.标准库中的string类2.1 string类2.2 auto和范围for2.3 string类常用的接口2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.6 string类对象的修改操作2…...

【Java笔记】第十四章:异常

一、概念【理解即可】 1. 异常&#xff1a;程序运行过程中&#xff0c;出现的非正常情况。 2. 异常的处理&#xff1a;当异常出现时&#xff0c;执行一段预先准备好的代码。 3. 异常的处理的必要性&#xff1a;减少用户的损失、同时减小给用户带来麻烦&#xff0c;也可以对用…...

Python游戏开发超详细(基础理论知识篇)

一、引导&#xff1a; Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python&#xff0c;你可以利用其强大的库和框架来创建各种类型的游戏&#xff0c;从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识&#xff0c;帮助你入门Python游戏开发。 二、理论知识…...

Python开发日记 -- 实现bin文件的签名

目录 1.数据的不同表现形式签名值不一样&#xff1f; 2.Binascii模块简介 3.问题定位 4.问题总结 1.数据的不同表现形式签名值不一样&#xff1f; Happy Muscle试运行了一段时间&#xff0c;组内同事再一次提出了新的需求&#xff1a;需要对bin文件签名。 PS&#xff1a;服…...

微软运用欺骗性策略大规模打击网络钓鱼活动

微软正在利用欺骗性策略来打击网络钓鱼行为者&#xff0c;方法是通过访问 Azure 生成外形逼真的蜜罐租户&#xff0c;引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据&#xff0c;微软可以绘制恶意基础设施地图&#xff0c;深入了解复杂的网络钓鱼操作&#xff…...

小程序无法获取头像昵称以及手机号码的深度剖析与解决方案

在当今数字化时代,小程序以其便捷、高效的特点,成为了人们生活和工作中不可或缺的一部分。然而,有时候开发者会遇到小程序无法获取头像昵称以及手机号码的问题,这给用户体验和业务流程带来了极大的困扰。本文将深入探讨这个问题的原因,并提供相应的解决方案。 一、引言 小…...

从0到1,搭建vue3项目

一 Vite创建Vue3项目 1.1.创建Vue3项目 1.1.1.运行创建项目命令 # 使用 npm npm create vitelatest 1.1.2、填写项目名称 1.1.3、选择前端框架 1.1.4、选择语法类型 1.1.5、按提示运行代码 1.1.6浏览器问 localhost:5173 预览 1.2项目结构 1.2.1vite.config.ts 1.2.2 pac…...

Mybatis mapper文件 resultType和resultMap的区别

在 MyBatis 中&#xff0c;resultType 和 resultMap 都用于定义从数据库查询结果到 Java 对象的映射规则&#xff0c;但它们之间存在着一些关键的区别。以下是对这两者的详细说明和区别&#xff1a; 1. resultType 定义 resultType 是 MyBatis 查询语句中的一个属性&#xf…...

文件下载漏洞

文件安全 文件下载 常见敏感信息路径 Windows C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.…...

【Flutter】状态管理:Provider状态管理

在 Flutter 开发中&#xff0c;状态管理是一个至关重要的部分。随着应用的规模和复杂性增加&#xff0c;简单的局部状态管理&#xff08;如 setState() 和 InheritedWidget&#xff09;可能变得难以维护和扩展。Provider 是一种推荐的、广泛使用的 Flutter 状态管理工具&#x…...

来个Oracle一键检查

启停、切换、升级、网络改造等场景下&#xff0c;需要对数据库有些基本检查操作&#xff0c;确认当前是否运行正常&#xff0c;主打一个简单和一键搞定。 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## linux vmstat 2 …...

C语言中的分支与循环(中 1)

关系操作符 C语言用于比较的表达式&#xff0c;称为"关系表达式"&#xff0c;里面使用的运算符称为关系运算符&#xff0c;关系运算符主要有以下6类。 > 大于运算符< 小于运算符>大于等于运算符< 小于等于运算符 相等运算符! 不相等运算符 下面是例子:…...

Git_GitLab

Git_GitLab 安装 服务器准备 安装包准备 编写安装脚本 初始化 GitLab 服务 启动 GitLab 服务 浏览器访问 GitLab GitLab 创建远程库 IDEA 集成 GitLab 安装 GitLab 插件 设置 GitLab 插件 安装 服务器准备 准备一个系统为 CentOS7 以上版本的服务器&#xff0c;使…...

如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

文章目录 一、什么是 Spring Boot Starter&#xff1f;二、为什么要自定义 Starter&#xff1f;三、自定义 Starter 的基本步骤1. 创建 Maven 项目2. 配置 pom.xml3. 创建自动配置类4. 创建业务逻辑类5. 创建 spring.factories 四、使用自定义 Starter五、总结推荐阅读文章 在使…...

CSS伪元素以及伪类和CSS特性

伪元素&#xff1a;可以理解为假标签。 有2个伪元素 &#xff08;1&#xff09;::before &#xff08;2&#xff09;::after ::before <!DOCTYPE html> <html> <head><title></title><style type"text/css">body::before{con…...

【论文笔记】Instantaneous Perception of Moving Objects in 3D

原文链接&#xff1a;https://arxiv.org/abs/2405.02781 简介&#xff1a;本文主张自动驾驶中细微运动的瞬时检测和量化与一般的大型运动同等重要。具体来说&#xff0c;由于激光雷达点云缺乏帧间对应关系&#xff0c;静态物体可能看起来在运动&#xff08;称为游泳效应&#x…...

Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具

关于Segugio Segugio是一款功能强大的恶意软件安全分析工具&#xff0c;该工具允许我们轻松分析恶意软件执行的关键步骤&#xff0c;并对其进行跟踪分析和安全审计。 Segugio允许执行和跟踪恶意软件感染过程中的关键步骤&#xff0c;其中包括从点击第一阶段到提取恶意软件的最…...

互联网系统的微观与宏观架构

互联网系统的架构设计&#xff0c;通常会根据项目的体量、业务场景以及技术需求被划分为微观架构&#xff08;Micro-Architecture&#xff09;和宏观架构&#xff08;Macro-Architecture&#xff09;。这两者的概念与职责既独立又相互关联。本文将通过一些系统案例&#xff0c;…...

数据库、数据仓库、数据湖和数据中台有什么区别

很多企业在面对数据存储和管理时不知道如何选择合适的方式&#xff0c;数据库、数据仓库、数据湖和数据中台&#xff0c;这些方式都是什么&#xff1f;有什么样的区别&#xff1f;企业根据其业务类型该选择哪一种&#xff1f;本文就针对这些问题&#xff0c;来探讨下这些方式都…...

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库&#xff1a; vscode-icons Andromeda Dark theme with a taste of the universe 仙女座&#xff1a;一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...

第14节 Node.js 全局对象

JavaScript 中有一个特殊的对象&#xff0c;称为全局对象&#xff08;Global Object&#xff09;&#xff0c;它及其所有属性都可以在程序的任何地方访问&#xff0c;即全局变量。 在浏览器 JavaScript 中&#xff0c;通常 window 是全局对象&#xff0c; 而 Node.js 中的全局…...

claude3.7高阶玩法,生成系统架构图,国内直接使用

文章目录 零、前言一、操作指南操作指导 二、提示词模板三、实战图书管理系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 在线考试系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 四、感受 零、前言 现在很多AI大模型可以…...