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

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.xdnf.cn/news/1524057.html

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

相关文章

【时时三省】(C语言基础)指针进阶 例题

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 字符数组例题&#xff1a; arr后面放了六个字符 所以这个数组的元素个数就是6 第一个arr 因为他计算的是一整个数组的大小 就是打印6 第二个arr0 arr没有单独放在它的内部 所以它计算的就是…

深智城基于超融合数据库MatrixOne的一站式交通大数据平台改造

在智慧交通应用中&#xff0c;数据处理需求极为复杂&#xff0c;涉及人、车辆、道路和环境等多个方面&#xff0c;产生了大量异构数据。交通管理人员需要对这些数据进行实时分析和决策&#xff0c;以应对各种交通事件。然而&#xff0c;在实际生产中会发现数据处理缺陷、管理复…

智慧平台赋能政务管理,声通科技助力政务管理智能化

在智能时代的大潮中&#xff0c;政务管理也在不断寻求创新与突破&#xff0c;在这方面&#xff0c;涌现出了很多优秀的公司。比如声通科技的子公司西安金讯数智信息技术有限公司&#xff0c;就在AI政务热线领域有很多创新成果&#xff0c;为政务管理的智能化升级提供了新思路。…

windows安装php7.4

windows安装php7.4 1.通过官网下载所需的php版本 首先从PHP官网&#xff08;https://www.php.net/downloads.php&#xff09;或者Windows下的PHP官网&#xff08;http://windows.php.net/download/&#xff09;下载Windows版本的PHP安装包。下载后解压到一个路径下。 2.配…

爆改YOLOv8|利用yolov10的PSA注意力机制改进yolov8-高效涨点

1&#xff0c;本文介绍 PSA是一种改进的自注意力机制&#xff0c;旨在提升模型的效率和准确性。传统的自注意力机制需要计算所有位置对之间的注意力&#xff0c;这会导致计算复杂度高和训练时间长。PSA通过引入极化因子来减少需要计算的注意力对的数量&#xff0c;从而降低计算…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步&#xff0c;视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能&#xff0c;特别是偏色检测和噪声检测&#xff0c;进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

window系统开机执行bat脚本

1&#xff0c;win R 打开运行对话框&#xff0c;然后如下图所示输入 第二&#xff0c;打开启动文件夹后&#xff0c;将想要执行的bat脚本&#xff0c;创建快捷方式&#xff0c;放在这里&#xff0c;重启电脑时就会执行这个程序

【Canvas与纹饰】环形小蜜蜂纹饰

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形小蜜蜂纹饰</title><style type"text/css"&g…

《OpenCV计算机视觉》—— 模板匹配

文章目录 一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle() 三、代码实现 一、模板匹配简单介绍 在Python中&#xff0c;模板匹配是一种在图像中查找与给定模…

【Next】4. 全局通用布局快速搭建

笔记来源&#xff1a;编程导航 基础布局 Next.js 支持全局根布局&#xff08;每个页面都会生效&#xff09;以及嵌套布局&#xff08;可以只对部分页面生效&#xff09;&#xff0c;详情可 参考文档。 在 src 下新建 layouts 目录&#xff0c;用于存放项目中的各种布局。在该目…

无法访问Github?Steam++来帮你

前言 有许多小伙伴发现在国内访问Github真的真的很难&#xff0c;毕竟Github的DNS很容易就被***。 昨天还看到有小伙伴在群上聊天问&#xff1a;如何访问Github&#xff0c;实际上你只需要安装个加速器&#xff0c;或者使用国内的镜像站就可以轻松访问。 当然&#xff0c;如…

【面试八股总结】MySQL 锁:全局锁、表级锁、行级锁

1. 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。 MySQL 提供了⼀个加全局读锁的方法&#xff1a; flush tables with read lock 释放全局锁&#xff0c;执行命令&#xff1a; unlock tables 需要让整个库处于只读状态的时候&#xff0c;可以使用全局锁命…

用AI将你变成二次元角色!——Face Cartoon API 使用教程

人像动漫化 API 对接说明 本文将介绍一种通过输入一张人脸照片&#xff0c;生成个性化的二次元动漫形象&#xff0c;可用于打造个性头像、趣味活动、特效类应用等场景&#xff0c;提升社交娱乐的体验。 接下来介绍下 人像动漫化 API 的对接说明。 注册试用链接 注册试用链接…

渣土车识别算法解决城市治理难题

随着城市化进程的加速&#xff0c;渣土车作为建筑工程中不可或缺的运输工具&#xff0c;其频繁的穿行和装载运输过程往往引发一系列问题&#xff0c;如超载、扬尘污染、乱倒渣土等&#xff0c;对城市环境和交通秩序造成了不良影响。为了解决这些问题&#xff0c;采用基于视觉分…

解决网站发邮件导致IP泄露的问题

原文网址&#xff1a;解决网站发邮件导致IP泄露的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍解决网站发邮件导致IP泄露的问题。 问题描述 网站一般都会加发邮件功能&#xff0c;比如&#xff1a;用户注册时使用邮箱注册&#xff0c;通过邮箱验证码验证&#xff1b;给用…

安装Selenium进行web⾃动化测试

目录 驱动安装驱动管理工具selenium安装selenium驱动浏览器的⼯作原理自动化测试常⽤函数1. 元素定位1.1. find_element 的基本用法1.2. 常见的 find_element 定位方式1.3. find_element 的使用注意事项1.4. find_element 的进阶用法 2. 操作测试对象3. 窗口操作4. 屏幕截图5. …

牛客周赛 Round 58(ABCDF)

目录 A.会赢吗&#xff1f; B.能做到的吧 C.会赢的&#xff01; D.好好好数 F.随机化游戏时间 A.会赢吗&#xff1f; 思路&#xff1a; 签到题&#xff0c;比大小 void solve() {double a,b;cin>>a>>b;if(a>b) cout<<"NO";else cout<&…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

阿里云Ubuntu系统安装/简单使用Kafka

一、安装kafka 1.下载安装包 1.1下载地址 https://kafka.apache.org/downloads 注意&#xff1a; 版本可以随意选择&#xff0c;我们选择版本为2.4.1 2.压缩文件上传/解压 2.1上传 2.2解压文件 #解压文件指令 tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/ #创建软…

【C/C++】C语言实现蛇形矩阵

目录 题目描述输入描述:输出描述:示例思路代码 题目描述 给你一个整数n&#xff0c;输出n∗n的蛇形矩阵。 输入描述: 输入一行&#xff0c;包含一个整数n 输出描述: 输出n行&#xff0c;每行包含n个正整数&#xff0c;通过空格分隔。 1<n<1000 示例 输入 4输出 …