Lesson 08 string类 (上)

C++:渴望力量吗,少年?

文章目录

  • 一、STL
    • 1. 概念
    • 2. STL的六大组件
    • 3. STL的重要性
  • 二、string类的介绍与使用
    • 1. 介绍
    • 2. 使用
        • (1)string类对象的常见构造
        • (2)string类对象的容量操作
        • (3)string类对象的访问及遍历操作
        • (4)string类非成员函数


一、STL

1. 概念

  STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
  此外,STL的版本不止一个,有由Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,后面又有了P. J. 版本,RW版本,SGI版本……
  SGI版本由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

2. STL的六大组件

  我们接下来要学的也是围绕这个图展开的。
在这里插入图片描述

3. STL的重要性

  STL无论是在公司的C++笔试还是面试都是必考的知识。网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,我们得以更好地使用C++进行开发。

二、string类的介绍与使用

1. 介绍

  string是表示字符串的字符串类,大体结构和C语言的字符串差不多,但是不同的点在于这是一个容器,在这个容器之中提供了很多有用的接口,下面我们就是要来学习这些方法分别是什么以及如何使用。
  注意:在使用string类时,必须包含头文件string以及using namespace std;

2. 使用

(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) (重点)拷贝构造函数

代码如下:

void Teststring()//先大概看一下
{cout << "我是Teststring :" << endl;string s1;                 // 构造空的string类对象s1string s2("hello bit");	// 用C格式字符串构造string类对象s2string s3(s2);             // 拷贝构造s3cin >> s1;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;
}
void Test_string()
{cout << "我是Test_string :" << endl;string s1("hello worldxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyy");string s2(s1);//拷贝构造cout << s2 << endl;string s3(s1, 6, 5);//在下标为6的位置开始取5个字符cout << s3 << endl;string s4(s1, 6, 3);cout << s4 << endl;//下面的这个函数重载和上面s3和s4是同一个,第三个参数是缺省参数npos,也就是size_t 的 -1//当字符串长度小于第三个参数或者第三个参数不写时,就直接取到字符串末尾string s5(s1, 6);cout << s5 << endl;string s6(s1, 6, s1.size() - 6);//等价于上一个,但是还是上面那个好用,因为不用自己计算cout << s6 << endl;string s7(10, 'a');//用10个a填充字符串cout << s7 << endl;string s8(++s7.begin(), --s7.end());//注意--end的位置所对应的字符并不会被取到(即左闭右开)cout << s8 << endl;string s9(10, 42);//注意第二个参数可以写数字,将被自动转换为ASCII为该数字所对应的字符cout << s9 << endl;
}
int main()
{Teststring();Test_string();return 0;
}
(2)string类对象的容量操作
函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回已经分配的空间总大小
empty (重点)检测字符串是否为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)请求更改capacity(可以为字符串预留空间)
resize (重点)将有效字符的个数改成n个,多出的空间用字符c填充

注意:
  A. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  B. clear()只是将string中有效字符清空,不改变底层空间大小。
  C. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用 ‘\0’ 来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。
  值得注意的是,resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小(因为空间不够resize使用就得扩容)。如果是将元素个数减少,底层空间总大小不变。(即只扩容,不缩容)
  D. reserve(size_t n=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

(3)string类对象的访问及遍历操作
函数名称功能说明
operator[ ] (重点)返回pos位置的字符
begin + endbegin获取一个字符的迭代器,end获取最后一个字符下一个位置的迭代器(也就是’\0’)
rbegin + rendrbegin获取最后一个字符(‘\0’)的前一个位置的迭代器,rend获取第一个字符的的前一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
(4)string类非成员函数
函数名称功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串

代码如下:

void test_string1()
{cout << "我是test_string1 :" << endl;//下面两个本质上是调用构造函数string s1;string s2("hello");cin >> s1;cout << s1 << endl;cout << s2 << endl;// 比strcat效率高而且好用string ret1 = s1 + s1;cout << ret1 << endl;string ret2 = s1 + "我来了";cout << ret2 << endl;
}void test_string2()
{cout << "我是test_string2 :" << endl;string s1("hello world");string s2 = "hello world";//单参数的构造函数的隐式类型转换// 遍历stringfor (size_t i = 0; i < s1.size(); i++){// 读cout << s1[i] << " ";//重载了 [],不是数组访问,实际上是返回第i个下标的字符}cout << endl;for (size_t i = 0; i < s1.size(); i++){// 写s1[i]++;//给s1的第i个下标的字符加1}cout << s1 << endl;// 迭代器(暂时当作指针使用)string::iterator it = s1.begin();//while (it < s1.end())  // 这里可以用小于号但是不建议,因为这里是物理空间上连续才可以用,像list这种物理空间不连续的用不了while (it != s1.end())   // 推荐玩法,通用{//注意end是指向最后一个字符(斜杠零的上一个字符)的下一个,也就是刚好是斜杠零// 读cout << *it << " ";++it;}cout << endl;it = s1.begin();while (it != s1.end()){// 写*it = 'a';++it;}cout << s1 << endl;list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>::iterator lit = lt.begin();while (lit != lt.end()){cout << *lit << " ";++lit;}cout << endl;
}//迭代器的好处在于屏蔽了底层的细节,都可以使用通用的方法来访问和修改容器void test_string3()
{cout << "我是test_string3 :" << endl;string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){// 读cout << *it << " ";++it;}cout << endl;//string::reverse_iterator rit = s1.rbegin();auto rit = s1.rbegin();//rbegin指向了字符串的最后一个字符(也就是斜杠零的前一个)while (rit != s1.rend())//rend指向了第一个字符的前一个字符的位置{cout << *rit << " ";++rit;//注意虽然是++,但是这个迭代器是倒着走的}//当然也可以用正向的迭代器,然后 --end 也可以达到同样的效果,但是没有这个好用cout << endl;// 原理:编译时编译器把范围for替换成迭代器// 读for (auto ch : s1){cout << ch << " ";}cout << endl;// 写for (auto& ch : s1){ch++;}cout << endl;cout << s1 << endl;
}void test_string4()
{cout << "我是test_string4 :" << endl;//string s1("hello worldxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyy");string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;//注意只有string有length,因为string出现的时间比stl早,当时用的是length,而后来的stl普遍用size//所以现在string既可以用size也可以用length,但是其他的容器只有sizecout << s1.capacity() << endl;s1.clear();//clear只清理数据,不释放空间,可以打印capacity查看(空间会由析构函数释放)s1 += "张三";//一个汉字一般是两个字节cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;
}int main()
{test_string1();test_string2();test_string3();test_string4();return 0;
}

剩下的部分在下一篇 ~


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

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

相关文章

数字人透明屏幕是如何工作的?

数字人透明屏幕是一种令人兴奋的科技产品&#xff0c;它结合了人脸识别、全息影像技术以及透明屏幕&#xff0c;为人们带来了全新的互动体验。本文将详细介绍数字人透明屏幕的工作原理以及其应用场景。 工作原理 数字人透明屏幕的工作原理主要包括人脸识别和全息影像技术。人脸…

数学建模-基于LightGBM和BP神经网络的互联网招聘需求分析与预测

基于LightGBM和BP神经网络的互联网招聘需求分析与预测 整体求解过程概述(摘要) 就业是民生之本&#xff0c;是发展之基&#xff0c;也是安国之策。2020 年新冠肺炎疫情的爆发&#xff0c;稳就业成为应对疫情、稳定社会的重要保障之一。随着数据新动能的发展&#xff0c;互联网…

用CHAT总结费曼学习法的关键

问CHAT&#xff1a;费曼学习法的关键 CHAT回复&#xff1a;费曼学习法是由著名物理学家理查德费曼所发明的一种学习方法&#xff0c;旨在以深入理解为目标&#xff0c;帮助自己学习新的知识和技能。 费曼学习法有四个关键步骤&#xff1a; 1. 学习&#xff1a;首先&#xff0…

阿里云服务器2核2G3M配置购买和续费同享99元1年,最后2天赶紧囤货

经济型e实例2核2G 3M固定带宽 40G ESSD Entry云盘&#xff0c;价格为99元1年&#xff0c;这款云服务器是阿里云在11月份推出的特价云服务器&#xff0c;不管是用户还是老用户&#xff0c;都觉得这个价格确实非常划算&#xff0c;但是有的用户觉得现在暂时没有使用云服务器的需求…

LLM大语言模型

大语言模型的定义 大语言模型&#xff08;英文&#xff1a;Large Language Model&#xff0c;缩写LLM&#xff09;&#xff0c;也称大型语言模型&#xff0c;是一种人工智能模型&#xff0c;旨在理解和生成人类语言。它们在大量的文本数据上进行训练&#xff0c;可以执行广泛的…

在Rust中处理命令行参数和环境变量

1.摘要 Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭代器精确控制保存的内容, 包括字符串和键值对的使用方法。…

美创科技受邀亮相第二届全球数字贸易博览会

11月23日-27日&#xff0c;由浙江省人民政府、商务部共同主办的第二届全球数字贸易博览会&#xff08;以下简称“数贸会”&#xff09;圆满落幕。围绕“国家级、国际性、数贸味”的目标定位&#xff0c;以“数字贸易 商通全球”为主题&#xff0c;数贸会重点展示数字贸易全产业…

伪原创工具,免费的5款伪原创工具

寻找一款合适的伪原创工具是提高写作效率的重要一环。在这里&#xff0c;我们为您推荐了五款不同特点的伪原创工具&#xff0c;并对它们进行了详细的测评。 第一款伪原创工具&#xff1a;147SEO改写 147SEO改写是一款强大的AI智能伪原创写作工具&#xff0c;具备多个模板供用…

亚马逊云科技 re:Invent 2023:科技前沿风向标

一、前言 亚马逊云科技 re:Invent 2023 已于内华达州的拉斯维加斯盛大举行。 re:Invent 2023 直播活动地址&#xff1a;https://webinar.amazoncloud.cn/reInvent2023/ 关注参加 re:Invent 大会你将有机会参与学习、交流&#xff0c;聆听专家演讲&#xff0c;并观看 Amazon …

物理层之三种数据交换方式(电路交换、报文交换、分组交换(数据报方式、虚电路方式))

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Linux端口流量统计

Ubuntu sudo apt-get install wiresharkCentOS sudo yum install wiresharkUDP端口统计 sudo tshark -i <interface> -f "udp port <port_number>" -a duration:60 -q -z conv,udp请将 替换为你的网络接口&#xff0c;<port_number> 替换为要监…

玻色量子对外合作

2023年 2023.7 首个央企量子云计算项目&#xff0c;中标&#xff01; 2023.6 勇闯“量子电力”新领域&#xff0c;玻色量子与清大科越达成战略合作 2023.5 玻色量子签约移动云“五岳”量子云计算创新加速计划&#xff01; 2023.3 “量子计算通信”&#xff01;玻色量子与…

Mysql基础(六)多表查询

版权申明&#xff1a;本文用于个人学习记录&#xff0c;学习课程为黑马程序员的mysql教程。如需获取官方的学习视频和文档资料&#xff0c;请至黑马程序员官方获取。下面附上教学视频的链接地址&#xff0c;向提供免费教学视频的老师致敬&#xff0c;学如逆水行舟&#xff0c;不…

一维数组,逆序存放并输出【样例输入】20 30 10 50 40 90 80 70【样例输出】70 80 90 40 50 10 30 20

一维数组&#xff0c;逆序存放并输出 【样例输入】 20 30 10 50 40 90 80 70 【样例输出】 70 80 90 40 50 10 30 20 以下是使用C语言编写的将一维数组逆序存放并输出的示例代码&#xff1a; #include <stdio.h>void reverseArray(int arr[], int size) {int start…

基于单片机红外测温(mlx90614)-原理图-PCB设计+源程序

一、系统方案 1、本设计采用52单片机作为主控器。 2、mlx90614采集温度&#xff0c;液晶显示温度值。 3、按键设置温度上下限。 4、实际测量温度小于下限或者大于上限&#xff0c;蜂鸣器报警&#xff0c;大于上限&#xff0c;风扇启动&#xff0c;低于下限&#xff0c;风扇停止…

选择更灵活的设计工具:SOLIDWORKS 软件网络版与单机版的比较

随着科技的飞速发展&#xff0c;工程设计领域对于高效、灵活的设计工具需求日益增加。SOLIDWORKS 作为一款广受欢迎的三维设计软件&#xff0c;提供了网络版和单机版两种选择。在本文中&#xff0c;我们将深入探讨这两个版本的区别&#xff0c;并为您详细介绍它们的价格差异。 …

【古月居《ros入门21讲》学习笔记】17_launch启动文件的使用方法

目录 说明&#xff1a; 1. launch文件作用 2. launch文件语法 根元素 参数设置 重映射、嵌套 3. 示例 创建功能包 1_simple.launch 编译 运行 2_turtlesim_parameter_config.launch 启动运行 启动运行显示说明 3_start_tf_demo_c.launch 启动运行 4_start_tf_d…

卓越进行时 | 西安交通大学校友莅临赛宁网安参观考察

近日&#xff0c;为了深入贯彻网络安全强国战略建设&#xff0c;积极发挥网络安全企业的先进作用&#xff0c;推动校企合作与协作共赢。西安交通大学领导携校友会来到赛宁网安网络安全卓越中心进行参观考察&#xff0c;为进一步的校企合作和产业孵化奠定基础。 活动期间&#…

docker安装Sentinel zipkin

文章目录 引言I Sentinel安装1.1 运行容器1.2 DOCKERFILE 参考1.3 pom 依赖1.4 .yml配置(整合springboot)II 资源保护2.1 Feign整合Sentinel2.2 CommonExceptionAdvice:限流异常处理类III zipkin引言 消息服务和请求第三方服务可不配置Sentinel。 I Sentinel安装 Sentinel …

list简单使用

目录 介绍 头文件 简单使用 Member functions Constructor operator ​编辑 Iterators Capacity empty size Element access: front/back Modifiers push_front pop_front push_back pop_back insert erase swap resize clear Operations remove uniq…