C++笔记---string类(简单地使用)

news2024/9/24 3:17:55

1. string类介绍

string类是C++标准库中给出的一种类类型,其目的是为了代替C语言中的字符串。

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

string类通过运算符重载,基本兼容了C语言中字符串的特性,字符串也可隐式类型转换为string类。

在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、 快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。

2. string类的使用

2.1 string类参考文档

string - C++ Reference

接下来的内容基本都是参考该文档的介绍,进行了相应的总结与拓展。

在使用string类时,必须包含#include<string>以及using namespace std;

2.2 string类的默认成员函数

2.2.1 构造函数

string类构造函数重载列表
默认构造函数string();
拷贝构造string(const string& str);
用子串(pos开始,长度为len)拷贝构造string(const string& str, size_t pos, size_t len = npos);
拷贝字符串string(const char* s);
拷贝字符串前n个元素string(const char* s, size_t n);
用字符c填充前n个元素string(size_t n, char c);

npos是string类的静态成员变量,值为类型为size_t,值为整形最大值。 

 2.2.2 析构函数

摧毁string对象,释放其分配到的所有空间。析构函数在对象销毁时自动调用,无需我们过多注意。

2.2.3 赋值运算符重载
赋值运算符重载列表
用另一个string对象赋值(深拷贝)string& operator=(const string& str);
用字符串赋值string& operator=(const char* s);

用字符赋值

string& operator=(char c);

2.3 string类的常用成员函数

2.3.1 迭代器相关

迭代器是STL容器的通用迭代访问媒介,包含4类:

迭代器类型及对应函数
正向迭代器string::iteratorbegin()---end()
反向迭代器string::reverse_iteratorrbegin()---rend()
const正向迭代器string::const_iteratorcrbegin()---crend()
const反向迭代器string::const_reverse_iteratorcrbegin()---crend()

四个对应函数分别可以获取四类迭代器。

正向迭代器即正向对字符串访问,反向迭代器即逆向对字符串访问,const修饰的用于const对象。

int main()
{
	string s("hello world");
    // 正向迭代
	string::iterator it = s.begin();
	while(it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
    
    // 逆向迭代
    string::reverse_iterator rit = s.rbegin();
    while(rit != s.rend())
    {
        cout << *rit << " ";
        rit++;
    }
    cout << *rit << endl;

	return 0;
}

 2.3.2 容量大小相关

string类的对象至少包含size,capacity和str三个成员变量,下面的函数与之有关:

对对象容量操作的重要函数
size_t size() const;返回字符串有效字符长度
size_t length() const;返回字符串有效字符长度(与size完全相同)
size_t capacity() const;返回空间总大小
bool empty() const;检测字符串释放为空串,是返回true,否则返回false
void clear() const清空有效字符
void reserve(size_t n = 0);为字符串预留空间

void resize(size_t n, char c = '\0');

将有效字符的个数该成n个,如果size变大,多出的空间用字符c填充

注意:

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

2.3.3 对象访问即遍历操作

string类对"[]"进行了重载,我们可以像访问字符串一样,使用"[]"对string类的对象的字符元素进行访问。

遍历string的方式有三种:

1. for + []

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s("hello world");
	for (int pos = 0; pos < s.size(); pos++)
	{
		cout << s[pos] << " ";
	}
	cout << endl;

	return 0;
}

2. 迭代器 

前面已经对这种遍历方式进行过介绍,此处不再重复
3. 范围for

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此 C++11中引入了基于范围的for循环。

for循环后的括号由冒号“ :”分为两部分:第一部分是范围 内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

范围for可以作用到数组和容器对象上进行遍历,范围for的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。

int main()
{
    string s("hello world");
    for (auto ch : s)
    {
        cout << ch << " ";
    }
    cout << endl;

    return 0;
}

补充:

auto关键字表示让编译器在编译时自动推导出变量的类型,这里的auto其实在编译时就被替换为了char,因为范围for从s中读取到的数据类型为char。

auto关键字的注意事项:

1. auto声明的变量必须由编译器在编译时期 推导而得。

2. 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&。

3. 当在同一行用auto声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

4. auto不能作为函数的参数,可以做返回值,但是建议谨慎使用。

5. auto不能直接用来声明数组。

 2.3.4 string类对象的修改操作
string类重点操作函数
void push_back(char c)string尾部插入单个字符

string& append(const string& str);

string& append(const string& str, size_t subpos, size_t sublen);

string& append(const char* s);

string& append(const char* s, size_t n);

string& append(size_t n, char c);

string尾部插入字符或字符串(或子串)

string& operator+=(const string& str);

string& operator+=(const char* s);

string& operator+=(char c);

string尾部插入单个字符或字符串
const char* c_str() const;返回char*类型指针指向的字符串

find / rfind

string::find - C++ Reference

string::rfind - C++ Reference

返回string中第一个(最后一个)与参数指定内容(串或字符)相匹配的位置

find_first_of / find_last_of

string::find_first_of - C++ Reference

string::find_last_of - C++ Reference

返回string中第一个(最后一个)与参数限定范围内的字符的位置

find_first_not_of / find_last_not_of

string::find_first_not_of - C++ Reference

string::find_last_not_of - C++ Reference

返回string中第一个(最后一个)不在参数限定范围内的字符的位置
string substr(size_t pos = 0, size_t len = npos) const;在str中从pos位置开始,截取len个字符,然后将其返回

注意:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差 不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

2.4 非成员函数

常用非成员函数
operator+合并两个字符串(string或C语言格式)并返回合并后的string
operator<<使string类型支持流输出
operator>>使string类型支持流提取
swap交换两个string对象的内容(直接交换size,capacity,str的值,效率高)
getline从流中持续读取字符放入string对象中,直到遇到指定字符(默认为换行符)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于vue框架的车辆交易管理系统n5xwr(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,汽车品牌,汽车信息,汽车标签,特价汽车 开题报告内容 基于Vue框架的车辆交易管理系统开题报告 一、研究背景与意义 随着汽车市场的蓬勃发展和消费者购车需求的日益增长&#xff0c;车辆交易活动变得愈发频繁和复杂。传统的车辆交…

工业主板在轨道交通中的应用特点

工业主板在轨道交通中的应用特点主要体现在以下几个方面&#xff1a; 一、强大的处理能力 高性能处理器&#xff1a;工业主板通常搭载高性能的处理器&#xff0c;如飞腾D2000八核CPU等&#xff0c;这些处理器能够高效处理轨道交通系统中的大量数据&#xff0c;确保系统运行的…

Python实战: 写入 Excel 的多个 Sheet

更多内容 个人网站&#xff1a;孔乙己大叔 一、引言 在处理大型数据集或需要向非技术用户展示分析结果时&#xff0c;Excel 是一种广泛使用的工具。然而&#xff0c;手动创建包含多个 Sheet 的 Excel 文件既耗时又容易出错。幸运的是&#xff0c;Python 提供了自动化这一过程的…

51单片机仿真单只共阳级数码管循环显示0-9

51单片机仿真单只共阳级数码管循环显示0-9 单片机AT89C51控制7段共阳数码管的实验报告 一、实验目的 本实验旨在通过使用AT89C51单片机和7段共阳数码管&#xff0c;学习如何编写控制程序以及实现数码管的动态显示。通过此实验&#xff0c;加深对单片机基本原理和实际应用的理…

进程间通信方式(共享内存、信号灯集、消息队列)

共享内存 特点 1&#xff09;共享内存是一种最为高效的进程间通信方式&#xff0c;进程可以直接读写内存&#xff0c;而不需要任何数据的拷贝。 2&#xff09;为了在多个进程间交换信息&#xff0c;内核专门留出了一块内存区&#xff0c;可以由需要访问的进程 将其映射到自己的…

1.第二阶段x86游戏实战2-前言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本次会有100章左右&#xff0c;会从0基础开始&#xff0c;内容有找游戏中的数据、分析游戏中的数据&…

C++ | Leetcode C++题解之第389题找不同

题目&#xff1a; 题解&#xff1a; class Solution { public:char findTheDifference(string s, string t) {int ret 0;for (char ch: s) {ret ^ ch;}for (char ch: t) {ret ^ ch;}return ret;} };

REAL-FAKE: EFFECTIVE TRAINING DATA SYNTHESISTHROUGH DISTRIBUTION MATCHING 论文学习

这篇文章主要讲的是生成数据在模型训练中的作用&#xff0c;对于接下来要研究的生成多模态数据具有重要的作用。 文章摘要首先讲生成数据很重要&#xff0c;但在训练高级的模型的时候效果不好。论文主要研究的是这背后的原理并且证明了生成数据的作用。 介绍部分&#xff0c;…

在社交物联网中使用MQTT协议和Hardy Wall算法实现有效的多播通信

这篇论文的标题是《EFFECTIVE MULTICAST COMMUNICATION USING MQTT PROTOCOL AND HARDY WALL ALGORITHM IN SIOT》&#xff0c;作者是 S.Jayasri 和 Dr. R.Parameswari&#xff0c;发表在《International Journal of Applied Engineering & Technology》2023年9月的第5卷第…

kubeadm方式升级k8s集群

一、注意事项 升级前最好备份所有组件及数据&#xff0c;例如etcd 不要跨两个大版本进行升级&#xff0c;可能会存在版本bug&#xff0c;如&#xff1a; 1.19.4–>1.20.4 可以 1.19.4–>1.21.4 不可以 跨多个版本的可以逐个版本进行升级。 二、查看当前版本 [rootk8s…

Solidity初体验

一、概念知识 什么是智能合约&#xff1f; 智能合约是仅在满足特定条件时才在区块链上部署和执行的功能&#xff0c;无需任何第三方参与。 由于智能合约本质上是不可变的和分布式的&#xff0c;因此它们在编写和部署后无法修改或更新。此外&#xff0c;分布式的意义在于任何…

上证50ETF期权交易策略有哪些?期权交易时要注意什么?

今天带你了解上证50ETF期权交易策略有哪些&#xff1f;期权交易时要注意什么&#xff1f;上证50ETF期权是一种以华夏50etf基金为标的物的金融衍生品&#xff0c;它允许投资者通过买卖期权合约来对冲风险或进行投机。 期权趋势型策略 趋势型的策略就是我们通常说的追涨杀跌&am…

git代码托管仓库02(分支与冲突)

分支 所有版本控制系统都以某种形式支持分支。使用分支意味着可以把自己的工作从开发主线上分离来进行重大的bug修改&#xff0c;开发新的功能&#xff0c;以免影响主线开发 该master就是分支 查看分支&#xff1a;git branch 添加分支&#xff1a; git branch 分支名 可以看…

C++笔记17•数据结构:二叉搜索树(K模型/KV模型实现)•

二叉搜索树 1.二叉搜索树 1. 二叉搜索树的查找 a 、从根开始比较&#xff0c;查找&#xff0c;比根大则往右边走查找&#xff0c;比根小则往左边走查找。 b 、最多查找高度次&#xff0c;走到到空&#xff0c;还没找到&#xff0c;这个值不存在。2. 二叉搜索树的插入 插入的具…

【图解版】Likes Vs Dislikes——C语言提高题【7 kyu】

一、原题 链接&#xff1a;Training on Likes Vs Dislikes | Codewars YouTube had a like and a dislike button, which allowed users to express their opinions about particular content. It was set up in such a way that you cannot like and dislike a video at the…

集成电路学习:什么是PWM脉冲宽度调制

一、PWM&#xff1a;脉冲宽度调制 PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种通过调整脉冲信号的宽度来控制电路输出的技术。在PWM中&#xff0c;信号的输出由一系列等幅值的脉冲组成&#xff0c;这些脉冲的宽度根据…

h5适配iOS——window.open失效

在H5开发中&#xff0c;打开一个新的标签页一般使用window.open。安卓中没啥限制&#xff0c;但是iOS的Safari出于安全限制&#xff0c;想使用该方法打开新的网页&#xff0c;必须得有用户手动触发&#xff0c;用代码自动打开是会失效的。 也就是说&#xff0c;window.open必须…

VS配置QGIS二次开发(VS2019+QT5+QGIS3.14)

1.1 QGIS软件下载 QGIS软件是基于QT5开发的GIS系统&#xff0c;其易用性及其高效性使其已经成为当下极具竞争力的GIS系统&#xff0c;其占有率足以与Esri的ArcGIS等主流GIS软件分庭抗礼。QGIS软件因其开源特性也使得其广受广大GIS开发者的青睐。 在本次《地理信息系统设计与开…

风趣图解LLMs RAG的15种设计模式-第二课

全部用的是Midjourney连续性一致性绘图画成

前端报文加密

前端加密功能 前端提供简单的AES对称加密算法&#xff0c;注意key 和后端网关配置相同&#xff0c;这里打包混淆后&#xff0c;相对安全。 &#xff08;lun-ui\src\store\modules\user.js、base-gateway-dev.yml&#xff09; 后端解密功能 使用hutool提供的工具类进行解密pub…