当前位置: 首页 > 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…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...