【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的基本概念
string
是STL(标准模板库)中的字符串类型,用于表示和操作字符串数据。它是一个类,封装了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
声明指针类型时,用auto
和auto*
没有任何区别,但用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[] = {1,2,3,4,5};
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 | 返回一个反向迭代器,指向字符串第一个字符前面的理论元素(被认为是字符串的反向结束)。 |
范围for | for的新型遍历方式 |
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程序员节|征文# 文章目录 繁星点点映夜空,晨曦微露照前程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. 异常:程序运行过程中,出现的非正常情况。 2. 异常的处理:当异常出现时,执行一段预先准备好的代码。 3. 异常的处理的必要性:减少用户的损失、同时减小给用户带来麻烦,也可以对用…...
Python游戏开发超详细(基础理论知识篇)
一、引导: Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python,你可以利用其强大的库和框架来创建各种类型的游戏,从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识,帮助你入门Python游戏开发。 二、理论知识…...
Python开发日记 -- 实现bin文件的签名
目录 1.数据的不同表现形式签名值不一样? 2.Binascii模块简介 3.问题定位 4.问题总结 1.数据的不同表现形式签名值不一样? Happy Muscle试运行了一段时间,组内同事再一次提出了新的需求:需要对bin文件签名。 PS:服…...
微软运用欺骗性策略大规模打击网络钓鱼活动
微软正在利用欺骗性策略来打击网络钓鱼行为者,方法是通过访问 Azure 生成外形逼真的蜜罐租户,引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据,微软可以绘制恶意基础设施地图,深入了解复杂的网络钓鱼操作ÿ…...
小程序无法获取头像昵称以及手机号码的深度剖析与解决方案
在当今数字化时代,小程序以其便捷、高效的特点,成为了人们生活和工作中不可或缺的一部分。然而,有时候开发者会遇到小程序无法获取头像昵称以及手机号码的问题,这给用户体验和业务流程带来了极大的困扰。本文将深入探讨这个问题的原因,并提供相应的解决方案。 一、引言 小…...
从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 中,resultType 和 resultMap 都用于定义从数据库查询结果到 Java 对象的映射规则,但它们之间存在着一些关键的区别。以下是对这两者的详细说明和区别: 1. resultType 定义 resultType 是 MyBatis 查询语句中的一个属性…...
文件下载漏洞
文件安全 文件下载 常见敏感信息路径 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 开发中,状态管理是一个至关重要的部分。随着应用的规模和复杂性增加,简单的局部状态管理(如 setState() 和 InheritedWidget)可能变得难以维护和扩展。Provider 是一种推荐的、广泛使用的 Flutter 状态管理工具&#x…...
来个Oracle一键检查
启停、切换、升级、网络改造等场景下,需要对数据库有些基本检查操作,确认当前是否运行正常,主打一个简单和一键搞定。 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## linux vmstat 2 …...
C语言中的分支与循环(中 1)
关系操作符 C语言用于比较的表达式,称为"关系表达式",里面使用的运算符称为关系运算符,关系运算符主要有以下6类。 > 大于运算符< 小于运算符>大于等于运算符< 小于等于运算符 相等运算符! 不相等运算符 下面是例子:…...
Git_GitLab
Git_GitLab 安装 服务器准备 安装包准备 编写安装脚本 初始化 GitLab 服务 启动 GitLab 服务 浏览器访问 GitLab GitLab 创建远程库 IDEA 集成 GitLab 安装 GitLab 插件 设置 GitLab 插件 安装 服务器准备 准备一个系统为 CentOS7 以上版本的服务器,使…...
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
文章目录 一、什么是 Spring Boot Starter?二、为什么要自定义 Starter?三、自定义 Starter 的基本步骤1. 创建 Maven 项目2. 配置 pom.xml3. 创建自动配置类4. 创建业务逻辑类5. 创建 spring.factories 四、使用自定义 Starter五、总结推荐阅读文章 在使…...
CSS伪元素以及伪类和CSS特性
伪元素:可以理解为假标签。 有2个伪元素 (1)::before (2)::after ::before <!DOCTYPE html> <html> <head><title></title><style type"text/css">body::before{con…...
【论文笔记】Instantaneous Perception of Moving Objects in 3D
原文链接:https://arxiv.org/abs/2405.02781 简介:本文主张自动驾驶中细微运动的瞬时检测和量化与一般的大型运动同等重要。具体来说,由于激光雷达点云缺乏帧间对应关系,静态物体可能看起来在运动(称为游泳效应&#x…...
Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具
关于Segugio Segugio是一款功能强大的恶意软件安全分析工具,该工具允许我们轻松分析恶意软件执行的关键步骤,并对其进行跟踪分析和安全审计。 Segugio允许执行和跟踪恶意软件感染过程中的关键步骤,其中包括从点击第一阶段到提取恶意软件的最…...
互联网系统的微观与宏观架构
互联网系统的架构设计,通常会根据项目的体量、业务场景以及技术需求被划分为微观架构(Micro-Architecture)和宏观架构(Macro-Architecture)。这两者的概念与职责既独立又相互关联。本文将通过一些系统案例,…...
数据库、数据仓库、数据湖和数据中台有什么区别
很多企业在面对数据存储和管理时不知道如何选择合适的方式,数据库、数据仓库、数据湖和数据中台,这些方式都是什么?有什么样的区别?企业根据其业务类型该选择哪一种?本文就针对这些问题,来探讨下这些方式都…...
vscode配色主题与图标库推荐
vscode配色主题推荐:Andromedavsocde图标库: vscode-icons Andromeda Dark theme with a taste of the universe 仙女座:一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…...
深度学习模型入门教程:从基础到应用
深度学习模型入门教程:从基础到应用 前言 在人工智能的浪潮中,深度学习作为一种强大的技术,正在各行各业中发挥着越来越重要的作用。从图像识别到自然语言处理,深度学习正在改变我们的生活和工作方式。本文将带您深入了解深度学…...
数据结构 软考
算法具有5个特性 可行性,有限性,确定性,输入, 输出 图: 有向图 Kruskal(克鲁斯卡尔)算法 和 prim(普鲁姆)算法 都是贪心算法 是一种用来在加权连通图中寻找最小生成树的算法,其操作对象是边. 找最小的不形成环 1.哈夫曼树(也叫最优树)…...
colcon构建ros2功能包时,出现exited with code 2报错的解决方案(bug)
背景: 在学习ros2时,跟着别人的示例进行构建,手敲的代码难免有一些语法错误。 问题: 在colcon构建时,并不会直接输出语法报错。而是出现exited with code 2错误,并提示未能生成功能包,就算加入…...
【大模型LLM面试合集】大语言模型架构_位置编码
位置编码 1.位置编码 不同于RNN、CNN等模型,对于Transformer模型来说,位置编码的加入是必不可少的,因为纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。为此我们大体有两个选择: 想办法将位置…...
FLINK 分流
在Apache Flink中,分流(Stream Splitting)是指将一条数据流拆分成完全独立的两条或多条流的过程。这通常基于一定的筛选条件,将符合条件的数据拣选出来并放入对应的流中。以下是关于Flink分流的详细解释: 一、分流方式…...
从零开始:构建一个高效的开源管理系统——使用 React 和 Ruoyi-Vue-Plus 的实战指南
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
windows下pycharm社区版2024下载与安装(包含新建第一个工程)
windows下pycharm社区版2024下载与安装 下载pycharm pycharm官网 安装pycharm 1.进入官网 pycharm官网 下载 点击Download–>右侧Other versions 下载对应的社区版(如下图):下载网址 2.点击运行下载好的安装包 点击下一步 3.更改pychar…...
重构案例:将纯HTML/JS项目迁移到Webpack
我们已经了解了许多关于 Webpack 的知识,但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后,就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构,项目位于 GitH…...
表格编辑demo
<el-form :model"form" :rules"status ? rules : {}" ref"form" class"form-container" :inline"true"><el-table :data"tableData"><el-table-column label"计算公式"><templat…...
企业自建邮件系统选U-Mail ,功能强大、安全稳定
在现代企业运营中,电子邮件扮演着至关重要的角色,随着企业规模的增长和业务的多样化,传统的租用第三方企业邮箱服务逐渐显现出其局限性。例如,存储空间受限、数据安全风险、缺乏灵活的管理和备份功能,以及无法与其他企…...
宜宾市政府网站建设/津seo快速排名
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 转自:http://blog.csdn.net/eager3466/article/details/42931017 Eclipse中安卓开发遇到parseSdkContent failed Could not initialize class Andro…...
wordpress多重筛选并排序/百度搜索次数统计
自动化测试工具 JMeter https://jmeter.apache.org/download_jmeter.cgi...
潍坊百度网站优化/seo神器
https://blog.csdn.net/shenxiaoming77/article/details/51603504 CART算法的重要基础包含以下三个方面: (1)二分(Binary Split):在每次判断过程中,都是对观察变量进行二分。 CART算法采用一种二分递归分割的技术&…...
海报设计网站官网/南安网站建设
文章转自 http://ju.outofmemory.cn/entry/278349 https://www.jianshu.com/p/102c4df69af9 RequiredDuringSchedulingRequiredDuringExecution :在调度期间要求满足亲和性或者反亲和性规则,如果不能满足规则,则POD不能被调度到对应的主机上…...
哪家做网站公司好/广州网络推广专员
原因:出现这个问题,可能有人move过表,或者disable 过索引。1、alter table xxxxxx move tablespace xxxxxxx 命令后,索引就会失效。2、alter index index_name unusable,命令使索引失效。 解决办法:1、重建…...
网站工作状态建设/百度云网盘资源分享网站
https://howtodoinjava.com/core-java/string-class/interview-stuff-about-string-class-in-java/ 转载于:https://blog.51cto.com/881206524/1968726...