c++的学习之路:9、STL简介与string(1)

一、STL

1、什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

也就是说STL就是一个模板,这个模板就是整合了很多库让我们方便使用的。

2、STL的版本

从网上我查到了四个版本就是下面的四个。

原始版本

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。

P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。

RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。

3、STL的六大组件

这个就是仿函数、算法、迭代器、空间配置、容器、配接器就是像下方的图片

4、STL的缺陷

STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订C++11出来已经相隔了13年,STL才进一步更新,STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的,STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取,STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的,这个就是我从网上查到的。

二、string

1、为啥学习string类

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

在字符串的实现,这时就不得不提美国的ASCLL码值,就是利用一个字节把各种符号字母变成数字存储,提供了一个很好的思路,这时就出现了一个叫做Unicode的万国码,这个就是按照ASCLL码表的方式存储各国的语言,这个里面有三种,分别是UTF-8、UTF-16、UTF-32各个字节可以存储各国的语言,中国也提出了一个叫做GBK的码表。

2、标准库中的string类

字符串是表示字符序列的类,标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性,string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string),string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string), 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总的来说: string是表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作, string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;不能操作多字节或者变长字符的序列,在使用string类时,必须包含#include头文件以及using namespace std;

下面将根据cplusplus这个网站来介绍和使用几个string类,网站就是下面这个链接。

https://legacy.cplusplus.com/reference/cmath/fmax/?kw=fmax

这个图片中的string介绍,第一句大概意思就是说string是一个关于字符的的对象,第二局就是为了方便使用这个string接口然后封装了这个类,下面这些我看这个文档的时候发现好多都不认识,要一个一个查的才能看的懂。

这个图就是介绍这个类的成员对象的介绍

这个图是成员函数的介绍

 这个图是迭代器的介绍

这个图就是容量的介绍

 这个图是元素访问的介绍

这个图是修饰符的介绍 

 这个图是字符串的介绍

 这个图是成员常量的介绍

 这个图是非成员函数重载的介绍

3、string类的常用接口说明

①string类对象的常见构造

constructor)函数名称功能说明
string() 构造空的string类对象,即空字符串
string(const char* s) 用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) 拷贝构造函数

测试代码如下,结果如图,s1没初始化,s2是hello word,s3是s2的拷贝。

void Test()
{
    string s1;
    string s2("hello word!");
    string s3(s2);
    cout << s1 << endl << s2 << endl << s3 << endl;
}

int main()
{
    Test();
    return 0;
}

②string类对象的容量操作

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty 检测字符串释放为空串,是返回true,否则返回false
clear 清空有效字符
reserve 为字符串预留空间**
resize 将有效字符的个数该成n个,多出的空间用字符c填充

 下方图片和代码就是上面几个函数的使用,如下方代码可以看出,size和length都是计算长度的,听说好像是因为在刚创建时是用length,后来全部封装了后其他的都是size这个也就改成size了,其他的使用方法如下,具体用法都注释了。

void Test()
{
    // 注意:string类对象支持直接用cin和cout进行输入和输出
    string s("hello, word!");
    cout << s.size() << endl;
    cout << s.length() << endl;
    cout << s.capacity() << endl;
    cout << s << endl;

    // 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
    s.clear();
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    // 将s中有效字符个数增加到10个,多出位置用'a'进行填充
    // “aaaaaaaaaa”
    s.resize(10, 'a');
    cout << s.size() << endl;
    cout << s.capacity() << endl;

    // 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
    // "aaaaaaaaaa\0\0\0\0\0"
    // 注意此时s中有效字符个数已经增加到15个
    s.resize(15);
    cout << s.size() << endl;
    cout << s.capacity() << endl;
    cout << s << endl;

    // 将s中有效字符个数缩小到5个
    s.resize(5);
    cout << s.size() << endl;
    cout << s.capacity() << endl;
    cout << s << endl;
}

 ③ string类对象的访问及遍历操作

函数名称功能说明
operator[] 返回pos位置的字符,const string类对象调用
begin+ endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式

下方代码和图片就是string类的三种遍历方式,使用方法如下方代码。 

void Test()
{
    string s("hello word");
    // 3种遍历方式:
    // 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符,
    // 另外以下三种方式对于string而言,第一种使用最多
    // 1. for+operator[]
    for (size_t i = 0; i < s.size(); ++i)
        cout << s[i] ;
    cout << endl;

    // 2.迭代器
    string::iterator it = s.begin();
    while (it != s.end())
    {
        cout << *it ;
        ++it;
    }
    cout << endl;
    // 3.范围for
    for (auto ch : s)
        cout << ch;
    cout << endl;
}


int main()
{
    Test();
    return 0;
}

④string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

可以从下方代码中看出这几个函数的用法。 

void Test()
{
    string str;
    str.push_back(' ');   // 在str后插入空格
    str.append("hello");  // 在str后追加一个字符"hello"
    str += 'w';           // 在str后追加一个字符'b'   
    str += "ord";          // 在str后追加一个字符串"it"
    cout << str << endl;
}

int main()
{
    Test();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

166.乐理基础-五声性调式、宫商角徵羽

如果到这五线谱还没记住还不认识的话去看102.五线谱-高音谱号与103.五线谱-低音谱号这两个里&#xff0c;这里面有五线谱对应的音名&#xff0c;对比着看 如果不认识调号去看112.五线谱的调号&#xff08;一&#xff09;、113.五线谱的调号&#xff08;二&#xff09;、114.快…

java学习之路-类和对象

前言 本文内容&#xff1a; 类的定义及其使用 this的引用 对象的构造及初始化 封装 static成员 代码块讲解 内部类 文章目录 1.类定义和使用 1.1了解什么是面向对象 1.2简单认识类 1.3定义类 1.4栗子 2.类的使用-类的实例化 2.1什么是实例化 2.2类和对象的说明 3.this引…

力扣热门算法题 174. 地下城游戏,189. 轮转数组,198. 打家劫舍

174. 地下城游戏&#xff0c;189. 轮转数组&#xff0c;198. 打家劫舍&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.31 可通过leetcode所有测试用例。 目录 174. 地下城游戏 解题思路 完整代码 Python Java 189. 轮转数…

Python中输出显示台的设置

效果: 前言 这种文字显示的方式很适合新手来学习,毕竟新手还学不到pygame做游戏的, Python入门我们一般都学的是输入输出的游戏,但是如果加上一些文字和背景的改善可能会更好. 如何改变字体颜色 字体颜色(跟他的变量名是一样的): #改变字体颜色 RED \033[91m GREEN \033…

kettle介绍-Step之加密及解密

加密 进入kettle的安装目录 cd /d D:\Application\pdi-ce-6.0.0.0-353\data-integration windows系统命令行执行&#xff1a;Encr.bat -kettle 123 cd /data/data-integration linux/mac系统命令行执行&#xff1a;encr.sh -kettle 123 可生成Encrypted 2be98afc86aa7f2e4cb79…

zabbix绑定钉钉进行通知,网页端添加JavaScript,无脑式操作

文章目录 前言一、编辑zabbix告警JavaScript脚本二、代码如下:编辑消息模板,自定义markdown格式的消息。总结前言 随着人工智能的不断发展,zabbix监控这门技术也越来越重要,一下进入正题。 一、编辑zabbix告警JavaScript脚本 没有没接可以新增媒介 其中URL是你的机器人地…

2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

stm32 HAL中断GPIO——1

1选择引脚为中断 中断详细配置 1 模式选择 上拉下拉 再点击NVIC可进行分组 再勾选如图 总结步骤 1选择中断 2配置时钟//选择外部时钟 3配置模式 4勾选NVIC

Python实现【贪吃蛇大作战】+源码

文章目录 前言&#xff1a;一、游戏概述1.游戏玩法2.游戏特色 二、游戏规则三、工具选择四、主要技术pygame 库numpy 库cocos2d 五、源码分享六、项目地址 前言&#xff1a; 今天的GitHub小游戏分享&#xff0c;我们将聚焦于一个经典而又极富趣味性的游戏——贪吃蛇大作战。这…

【C++】二分查找算法(模板)

重点 只需要记住两点&#xff1a; 1.left right 时&#xff0c;一定就是最终结果&#xff08;包括找不到目标值&#xff09;&#xff0c;无需再次判断&#xff0c;如果判断就会死循环 2.求中点如果是求左端点 mid left (right - left)/2 如果是求右端点 mid left (right -…

【Python项目】AI动物识别工具

目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域&#xff0c;拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中&#xff0c;鉴于地球的广阔地域和多样的气候条件&#xff0c;利用图像技术捕…

关于我20系列显示安装cuda11.8版本一直还报找不到nvcc.exe的这档子事

这几天研究3d gaussian&#xff08;3d高斯&#xff09; 由于本人电脑还是五年前的20系列显卡&#xff0c;本身还是支持cuda的&#xff0c;就没想那么多&#xff0c;结果处处踩坑处处踩雷&#xff0c;在研究2天国内资料翻遍了的情况下&#xff0c;终于去外面看老外发了一个chec…

arm的状态寄存器

目录 一、arm 的 PSRs二、CPSR2.1 CPSR_cxsf 三、SPSR四、APSR 一、arm 的 PSRs arm 中有很多程序状态寄存器&#xff08;Program Status Registers&#xff0c;PSRs&#xff09;用于存储处理器的状态信息&#xff0c;包括 CPSR\SPSR\FPSR\APSR 等&#xff1a; CPSR&#xff…

九州金榜家庭教育孩子沉迷手机网络怎么办?

孩子沉迷于手机网络的问题&#xff0c;在当今社会已变得日益严重。手机网络的普及使得孩子们过早地接触到了虚拟世界&#xff0c;而长时间沉浸其中不仅影响他们的学业&#xff0c;还可能对他们的身心健康造成危害。那么&#xff0c;面对这一问题&#xff0c;家长应该如何应对呢…

数字人视频合成平台推荐

数字人讲解视频和全景作品的结合是一种全新的数字交互方式&#xff0c;可为用户提供更加直观和具有沉浸感的内容展示和交互体验&#xff0c;从而适用于诸如旅游、展览、博物馆、教育培训、泛房地产、以及娱乐和文化等应用场景。 当前数字人合成视频技术已经发展至日益成熟的阶…

Oracle基础-PL/SQL编程 备份

1、PL/SQL简介 PL/SQL块结构 约定&#xff1a;为了方便&#xff0c;本文后面把PL/SQL简称PL。 PL程序都是以块&#xff08;BLOCK&#xff09;为基本单位&#xff0c;整个PL块分三部分&#xff1a;声明部分&#xff08;使用DECLARE开头&#xff09;、执行部分(以BEGIN开头)和异…

武汉星起航:跨境电商优势尽显,引领全球贸易与文化交流新浪潮

在全球化日益加深的今天&#xff0c;跨境电商行业以其独特的优势和好处&#xff0c;逐渐超越了国内电商行业&#xff0c;成为了电商领域的新宠。跨境电商不仅拓展了企业的市场范围&#xff0c;还为消费者带来了更多选择和便利。武汉星起航认为与国内电商相比&#xff0c;跨境电…

5032温补晶振的一些常用型号和实例应用

5032晶振是常用的一种尺寸的晶振&#xff0c;而5032温补晶振因为其高精度高稳定性而被广泛应用。小尺寸封装5.0mm*3.2mm*1.45mm&#xff0c;非常节省空间&#xff0c;便于设计与使用。其实爱普生推出了一系列的5032温补晶振:以TG5032CAN、TG5032SAN、TG5032CDN、TG5032SDN&…

IDEA一行代码出现下划实线,怎么处理?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Qt】使用Qt实现Web服务器(九):EventSource+JSON实现工业界面数据刷新

1、效果 效果如下,实时刷新温度、湿度 2、源码 2.1 index.html <html><body> <!-- 页面布局,本人对HTML标签不熟悉,凑合看吧 --> <div><label for