Lesson 08 string类 (上)

news2024/11/29 3:57:40

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类对象s1
     string s2("hello bit");	// 用C格式字符串构造string类对象s2
     string s3(s2);             // 拷贝构造s3
     
     cin >> 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";//单参数的构造函数的隐式类型转换

    // 遍历string
    for (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,但是其他的容器只有size
    cout << 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.coloradmin.cn/o/1266421.html

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

相关文章

jetson nano 串口通信

目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…

交流负载的原理与应用

交流负载是指能够消耗交流电能的设备或系统&#xff0c;在电力系统中&#xff0c;交流负载是不可或缺的一部分&#xff0c;它们将电能转化为其他形式的能量&#xff0c;以满足人们生产和生活的需求。交流负载的原理与应用涉及到许多方面&#xff0c;包括电气工程、电子技术、自…

RT_Thread_内核包版本与芯片包版本不一致的编译报错排查

按时间线写的&#xff0c;建议看完&#xff0c;因为中间有的步骤不必重蹈覆辙。 1、安装RT_Thread Studio、STM32F4的SDK&#xff0c;新建工程编译报错error: struct serial_configure has no member named flowcontrol 1.1、报错含义 结构体struct serial_configure没有flow…

C语言——I /深入理解指针(三)

一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有⼀种使⽤⽅式如下&#xff1a; int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

牛客算法题 HJ100 等差数列 golang语言实现

算法题目 HJ100 等差数列 描述 等差数列 2&#xff0c;5&#xff0c;8&#xff0c;11&#xff0c;14。。。。 &#xff08;从 2 开始的 3 为公差的等差数列&#xff09; 输出求等差数列前n项和数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 10001≤n≤1000 输入描述&#xff…

docker-compose Install OrangeHRM

OrangeHRM 前言 OrangeHRM 是一个全面的人力资源管理(HRM) 系统,它包含任何企业所需的所有基本功能。OrangeHRM旨在支持任何规模的团队,包括初创企业、中小企业以及大型跨国组织。 OrangeHRM 提前条件 OrangeHRMdocker & docker-composer 安装or

MYSQL存储

注意&#xff1a; 1.如果没有指定的SESSION/GLOBAL&#xff0c;默认是SESSION&#xff0c;会话变量。 2.mysql服务重新启动之后&#xff0c;所设置的全局参数会失效&#xff0c;要想不失效&#xff0c;可以在/etc/my.cnf中配置。 变量 用户定义变量是用户根据需要自己定义变量…

STM32F407-14.3.5-01捕获_比较通道

捕获/比较通道 每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器) 包括: 捕获的输入部分(数字滤波、多路复用和预分频器)&#xff0c; 输出部分(比较器和输出控制)。 中文参考手册中框图分成了三大模块, 把框图合并成了一个整体,以便更好的理解捕获输…

2022年03月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题2分,共30分) 第1题 由1,2,3,4,5,0这六个数字经过排列组合能够组成多少个六位数偶数?注意:每一位都不相同,最高位不能为0。 A:720 B:360 C:312 D:88 答案:C 逻辑知识单选题 第2题 运行以下程…

贪心算法策略实现

贪心算法 贪心算法&#xff1a;基于某种情况进行一个排序。 贪心算法得到的是优良解&#xff0c;而非全局最优解。需要证明局部最优解 全局最优解 经典贪心算法 —— 会议问题 对于这个问题 &#xff0c;我们提出贪心策略&#xff1a; 策略1&#xff1a;按照会议的持续时间长…

SpringBoot : ch09 整合Redis

前言 当你的应用程序需要一个快速、可扩展的内存数据库时&#xff0c;Redis是一个非常流行的选择。通过将Redis与Spring Boot集成&#xff0c;你可以轻松地利用Redis的功能&#xff0c;例如缓存、会话存储和消息队列等&#xff0c;从而提升应用程序的性能和可伸缩性。 在本教…

FUSB302MPX USB Type-C端口控制器 芯片功能介绍

FUSB302MPX是带PD的可编USB Type-C控制器,除了默认的SRC功能,器件还支持可编程性低的DRP/SRC/SNK.器件具有USB Type-C检测包括附着/分离和取向.FUSB302MPX集成了USB BMC供电协议的物理层,允许高达100W功率和角色互换.BMC PD区块完全支持Type-C指标的替代接口.器件具有自主DRP切…

git rebase冲突说明(base\remote\local概念说明)

主线日志及修改 $ git log master -p commit 31213fad6150b9899c7e6b27b245aaa69d2fdcff (master) Author: Date: Tue Nov 28 10:19:53 2023 08004diff --git a/123.txt b/123.txt index 294d779..a712711 100644 --- a/123.txtb/123.txt-1,3 1,4 123 4^Mcommit a77b518156…

UE 事件分发机制(一) day9

观察者模式原理 观察者模式通常有观察者与被观察者&#xff0c;当被观察者状态发生改变时&#xff0c;它会通知所有的被观察者对象&#xff0c;使他们能够及时做出响应&#xff0c;所以也被称作“发布-订阅模式”。总得来说就是你关注了一个主播&#xff0c;主播的状态改变会通…

Rabbitmq发送邮件并消费邮件

&#x1f4d1;前言 本文主要是【Rabbitmq】——Rabbitmq发送邮件并消费邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

小程序开发中SSL证书的重要作用

随着互联网技术的发展&#xff0c;越来越多的企业和个人开始开发自己的小程序来满足各种需求。然而&#xff0c;在这个过程中&#xff0c;安全性和稳定性成为了开发者必须关注的重点之一。为了保障用户的隐私安全和体验效果&#xff0c;越来越多的小程序开发者开始采用SSL证书进…

Sentaurus TCAD半导体器件入门常用案例合集

Sentaurus TCAD是用于模拟半导体器件和工艺的工具之一&#xff0c;可以帮助工程师设计电路元件&#xff0c;优化半导体工艺和器件性能。主要功能包括&#xff1a;半导体器件建模&#xff08;用于建立各种半导体器件的物理模型工艺模拟&#xff09;、半导体器件的制造工艺模拟&a…

VT-VRPA2-1-1X/V0/T5控制4WRE6比例方向阀放大板

带阀芯位移反馈不带集成式放大器比例方向阀控制放大器&#xff0c;替代力士乐同型号产品&#xff0c;可以完全互换使用&#xff1b;适用于控制力士乐系列带电位置反馈的4WRE6通径和4WRE10通径2X系列比例方向阀&#xff1b;0~10V、4~20mA指令控制信号任意可选&#xff1b;直接安…

电气制图用什么软件?CAD和Eplan哪个更胜一筹?

身为电气工程师&#xff0c;每天打交道最多的可能不是自家对象&#xff0c;而是时时刻刻攥在手里的电气图。目前市面上制作电路图的软件形形色色&#xff0c;但是AutoCAD Electrical和Eplan是目前大家使用率最高的两款电气制图软件。 EPLAN是一款专业的电气设计软件&#xff0…

GraphCast:基于机器学习的全球中期天气预测模型

文章信息 文章题为”GraphCast: Learning skillful medium-range global weather forecasting”&#xff0c;该文章于2023年发表至Science&#xff0c;文章内容主要关于利用机器学习模型&#xff0c;实现高效、准确的全球中期天气预测。由于文章内容较多&#xff0c;本文仅对研…