【C++】STL学习之旅——初识STL,认识string类

news2024/11/16 3:16:03

在这里插入图片描述

string类

  • 1 STL 简介
  • 2 STL怎么学习
  • 3 STL缺陷
  • 4 string
    • 4.1 初识 string
    • 4.2 初步使用
      • 构造函数
      • 成员函数
  • 5 小试牛刀
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1 STL 简介

现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽。接下来我们先来介绍一下STL:

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。 STL 最初由惠普实验室开发,于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分。

主要分为这几个版本:HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等
其中我们需要重点学习的是SGI版本:
SGI版本由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。学习STL 要阅读部分源代码,主要参考的就是这个版本

2 STL怎么学习

网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。那么我们应该如何学习呢?
首先就是关注官方网站 C++中查阅资料。我推荐使用这个:C++库
然后 学好英语很重要,要学会阅读文档,无论学习什么新技术,英语绝对是必不可少的。(程序员的尽头是英语
在这里插入图片描述

3 STL缺陷

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

4 string

接下来让我们开始学习string类吧:

4.1 初识 string

根据上面我们进行的搜索我们可以了解到 :

  1. string是一个代表字符串的对象。
  2. 标准string类提供了类似标准字符容器的接口,而且添加了单字节操作的特性。
  3. string类 是 basic_string类模版的一个实例,使用char类型来实例化basic_string 模版类。
  4. 注意这个类独立于所使用的编码来处理字节: 如果使用 multi-byte 或 多长度字符(例如UTF-8编码),这个类的所有成员(比如 长度和大小),以及该类的迭代器将仍然在该字节(而不是实际的编码字符)来操作。

可以总结为以下内容:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列

在使用string类时,必须包含#include头文件string 以及using namespace std;

4.2 初步使用

构造函数

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

来看使用效果:

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

int main() {
	string s1;
	string s2("Hello!");
	string s3(5,'n');
	string s4(s2);

	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;

	return 0;
}

流操作符也在string类中进行了重载,输出很丝滑~
在这里插入图片描述

成员函数

成员函数作用
begin()返回字符首位置 (迭代器常用 )
end()返回字符结尾 (迭代器常用)
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

来使用一下:

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

int main() {

	string s1("Hello!");

	cout << s1 << endl;
	//有效字符长度
	cout <<"有效字符长度:" << s1.size() << endl;
	//字符串所占空间
	cout << "字符串所占空间:" << s1.capacity() << endl;
	//实际长度(不包括‘\0')
	cout << "实际长度:" << s1.length() << endl;
	//检查是否为空 (为空返回1 不为空返回0)
	cout <<"是否为空:" << s1.empty() << endl;


	//-----------清空试试-------
	cout << "\n---------清空--------\n";
	s1.clear();
	cout << s1 << endl;
	//有效字符长度
	cout << "有效字符长度:" << s1.size() << endl;
	//字符串所占空间
	cout << "字符串所占空间:" << s1.capacity() << endl;
	//实际长度(不包括‘\0')
	cout << "实际长度:" << s1.length() << endl;
	//检查是否为空 (为空返回1 不为空返回0)
	cout << "是否为空:" << s1.empty() << endl;

	//--------更改大小-------
	cout << "\n---------更改有效字符个数--------\n";
	s1.resize(10, 'a');
	cout << s1 << endl;
	//有效字符长度
	cout << "有效字符长度:" << s1.size() << endl;
	//字符串所占空间
	cout << "字符串所占空间:" << s1.capacity() << endl;
	//实际长度(不包括‘\0')
	cout << "实际长度:" << s1.length() << endl;
	//检查是否为空 (为空返回1 不为空返回0)
	cout << "是否为空:" << s1.empty() << endl;
	return 0;
}

看看运行效果:
在这里插入图片描述
这样,对string就有了一个大概了解。
有些注意事项:

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

5 小试牛刀

家人们! 上链接!!!:字符串相加
在这里插入图片描述
我们来尝试使用我们刚刚学习的string来解决问题:
首先:我们不能简单的进行字符串转换为整数,然后相加,最后转换为字符串。你问我为什么?
请看VCR:
在这里插入图片描述
测试用例没问题,但是Leetcode给我们的数据太大了,longlong都没办法容纳。
所以我们使用最朴素的算法:竖式算法
很简单 依次相加 按运算法则进位 得到该位的数值然后插入到string即可。

class Solution {
public:
    string addStrings(string num1, string num2) {
    	// 从个位开始,所以取字符串末位
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        // 计算所需变量
        int n1 = 0,n2 = 0 ,carry = 0;
        //答案string对象
        string ans = "";
        //开始计算
        while(i >= 0 || j >= 0 || carry != 0 ){
        //这里一定要写判断,不然会发生数组越界。
            n1 = i >= 0 ? num1[i] - '0' : 0; 
            n2 = j >= 0 ? num2[j] - '0' : 0;
            //得到结构就尾插
            ans.push_back((n1 + n2 + carry) % 10 + '0');
            //迭代
            carry = (n1 + n2 + carry) / 10;
            i--;
            j--;

        }
        //注意因为我们是尾插的,所以要调换头尾顺序才可以
        //这里使用 对称对调法。
        for(int k = 0 ;k<ans.size()/2;k++){
            char tmp = ans[k] ;
            ans[k] = ans[ans.size() - 1 - k];
            ans[ans.size() - 1 - k] = tmp;
        }
        //这个函数更方便,但是不方便解释了在这里
        //reverse(ans.begin(),ans.end());
        return ans;
    }
};

来看效果奥:
在这里插入图片描述

牛批!!!!! 过啦!!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

PyCharm如何添加python库

1.使用pip命令在国内源下载需要的库 下面使用清华源&#xff0c;在cmd中输入如下命令就可以了 pip install i https://pypi.tuna.tsinghua.edu.cn/simple 包名版本号2.如果出现报错信息&#xff0c;Cannot unpack file…这种情况&#xff0c;比如下面这种 ERROR: Cannot unpa…

考研复试指南

1. 记住&#xff0c;复试的本质不是考试&#xff0c;而是一场自我展示。 考研复试并非简单的知识考察&#xff0c;更是一场展示自我能力和潜力的机会。除了学科知识&#xff0c;考官更关注你的综合素质、学术兴趣和未来发展规划。因此&#xff0c;要保持自信&#xff0c;用更全…

前端canvas项目实战——简历制作网站(五):右侧属性栏(字体、字号、行间距)

目录 前言一、效果展示二、实现步骤1. 优化代码&#xff0c;提取常量2. 实现3个编辑模块3. 实现updateFontProperty方法4. 一个常见的用法&#xff1a;仅更新当前选中文字的样式 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们扩充了线条对象&#xff08;fabric.…

带你快速初步了解Python字典

1.字典 定义多个数据一般使用列表&#xff0c;但是列表也存在一定的缺陷 若列表中有多个元素&#xff0c;想访问其中某个元素&#xff0c;比较不方便 定义字典的语法&#xff1a;{key1:value1, key2:value2, key3:value3......} 字典和列表习惯的使用场景&#xff1a; &qu…

(3)(3.1) FlightDeck FrSky发射器应用程序

文章目录 前言 1 概述 2 Turnkey Packages 3 参数说明 前言 ​Craft and Theory 的 FlightDeck 可让你轻松查看飞行模式、高度、速度、姿态和关键系统警报&#xff0c;包括故障保护和电池错误&#xff0c;如电池不平衡警告和发射机低电量警报。 1 概述 Craft and Theory 的…

Jmeter 安装

JMeter是Java的框架&#xff0c;因此在安装Jmeter前需要先安装JDK&#xff0c;此处安装以Windows版为例 1. 安装jdk&#xff1a;Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…

【NR 定位】3GPP NR Positioning 5G定位标准解读(一)

目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例&#xff0c;3GPP考虑按…

JAVAEE初阶 JVM(二)

垃圾回收和双亲委派模型 1.双亲委派模型2.垃圾回收机制(1) 识别垃圾1.引用计数2.可达性分析 (2) 销毁垃圾1.标记清除2.复制算法3.标记整理 3.分代回收 1.双亲委派模型 描述了如何查找.class文件的策略. 同时JVM中有专门进行类加载的操作,有一个模块,叫做类加载器. 上述就是为了…

安装Realtek Audio Driver失败[Error Code:-0001]

安装Realtek Audio Driver失败[Error Code&#xff1a;-0001] 首先来看一下我们遇到的问题GPT4的推荐解决方法&#xff08;流水账&#xff09;笔者自己真实有效的解决办法 首先来看一下我们遇到的问题 描述&#xff1a;在笔记本更新完电脑之后&#xff0c;没有自带声音驱动。然…

实例:NX二次开发收集关于Open C的计时信息

目录 一、概述 二、实现的功能 三、代码实现以及详细解析 一、概述 在NX二次开发过程中&#xff0c;我们为了效率经常会进行Open C的计时统计&#xff0c;这个实例可用于收集关于Open C的计时信息程序&#xff0c;并且在计时测试中很有用。该实例通过UF_begin_timer启动一个…

Pyglet图形界面版2048游戏——详尽实现教程(上)

目录 Pyglet图形界面版2048游戏 一、色块展示 二、绘制标题 三、方阵色块 四、界面布局 五、键鼠操作 Pyglet图形界面版2048游戏 一、色块展示 准备好游戏数字的背景颜色&#xff0c;如以下12种&#xff1a; COLOR ((206, 194, 180, 255), (237, 229, 218, 255), (23…

首例以“冠状病毒”为主题的勒索病毒,篡改系统MBR

前言概述 2020年勒索病毒攻击仍然是网络安全的最大威胁&#xff0c;在短短三个月的时间里&#xff0c;已经出现了多款新型的勒索病毒&#xff0c;关于2020年勒索病毒攻击新趋势&#xff0c;可以阅读笔者写的上一篇文章&#xff0c;里面有详细的分析&#xff0c;从目前观察到的…

深入解剖指针(4)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 回调函数 qsort使用举例 使用qsort函数排序整型数据 使用qsort排序结构数据 qsort函数的模拟实现 回调函数 回调函数就是一个通过函数指…

java-幂等性

幂等性 1.1幂等性定义&#xff1a; 在计算机领域中&#xff0c;幂等&#xff08;Idempotence&#xff09;是指任意一个操作的多次执行总是能获得相同的结果&#xff0c;不会对系统状态产生额外影响。在Java后端开发中&#xff0c;幂等性的实现通常通过确保方法或服务调用的结…

68-解构赋值,迭代器,生成器函数,Symbol

1.解构赋值(针对数组array&#xff0c;字符串String及对象object以) 结构赋值是一种特殊的语法&#xff0c;通过将各种结构中的元素复制到变量中达到"解构"的目的&#xff0c;但是数组本身没有改变 1.1解构单层数组 <script>let arr [1,2,3,4,5];//获取数组…

C++之queue和deque

1、queue queue&#xff08;队列&#xff09;&#xff0c;一种数据结构&#xff0c;可以让某些数据结构的操作变得简单。队列&#xff08;queue&#xff09;最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后&#xff0c;比它后进入队列的元素才能够出…

【python】遵守 robots.txt 规则的数据爬虫程序

程序1 编写一个遵守 robots.txt 规则的数据爬虫程序涉及到多个步骤&#xff0c;包括请求网页、解析 robots.txt 文件、扫描网页内容、存储数据以及处理异常。由于编程语言众多&#xff0c;且每种语言编写爬虫程序的方式可能有所不同&#xff0c;以下将使用 Python 语言举例&am…

Material UI 5 学习01-按钮组件

Material UI 5 学习01-按钮组件 一、安装Material UI二、 组件1、Button组件1、基础按钮2、variant属性3、禁用按钮4、可跳转的按钮5、disableElevation属性6、按钮的点击事件onClick 2、Button按钮的颜色和尺寸1、Button按钮的颜色2、按钮自定义颜色3、Button按钮的尺寸 3、图…

Topaz Gigapixel AI:让每一张照片都焕发新生mac/win版

Topaz Gigapixel AI 是一款革命性的图像增强软件&#xff0c;它利用先进的人工智能技术&#xff0c;能够显著提升图像的分辨率和质量。无论是摄影爱好者还是专业摄影师&#xff0c;这款软件都能帮助他们将模糊的、低分辨率的照片转化为清晰、细腻的高分辨率图像。 Topaz Gigap…

每日五道java面试题之mysql数据库篇(三)

目录&#xff1a; 第一题. 百万级别或以上的数据如何删除&#xff1f;第二题. 前缀索引第三题. 什么是最左前缀原则&#xff1f;什么是最左匹配原则?第四题. B树和B树的区别第五题. 使用B树和B树好处 第一题. 百万级别或以上的数据如何删除&#xff1f; 关于索引&#xff1a;…