STL 容器详解——string 类_sgi stl string,大数据开发-Camera内存问题剖析

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

所谓的算法和容器就是对应我们常说的算法和数据结构,容器就是数据结构。

重要性🤔

C++是一门很棒的语言,唯一的缺陷就是相关的库太少,不是因为大家不想为它写库,而是它的库很难写。而STL是C++v的标准模板库,里面封装了很多经典的算法,再加上是基于模板的,适用于多种数据类型,某种程度上说是通用算法,所以它在C++中的地位很高。就拿咱题目说,一个能用 C++ 解决的题,有些也支持C语言实现,但是一句 STL 能搞定上的在C里面可能会需要搞出二级指针这种属实恶心人的东西。

学 C++ 不学STL(现在叫标准程序库或许好点,后者对STL有所改进,应该算是STL的超集),一定是你人生一大遗憾,可惜现在很多学校教 C++ 的时候,根本没有提到过STL。

所以论STL重要性,这个问题本身就是个问题,不清楚 STL 地位的 C++ 学习者什么成分咱就不说了。
在这里插入图片描述

string 类🤔

我为什么想第一个针对学习 string 类?原因很简单,早在C语言阶段就学习了字符串,为了操作方便,C语言标准库提供了一堆有关字符串操作的函数——str 系列函数,但这些函数是和字符串分开的,不太适合OOP的思想,而且底层空间需要用户自己管理,稍不留神就会越界访问。

在这里插入图片描述
从定义来看,string 类是一个 typedef 的模板,而其实库里面并不仅仅只有一种 string,还有下面这些个玩意儿:
在这里插入图片描述
为什么会有这么多派生?其实这就要牵扯到编码问题。我们知道从最早的 ASCII 码到后来的 unicode(统一码也叫万国码,世界语言的映射表),unicode 又包含了 utf-8,utf-16,utf-32,再到后来的 gbk(国标扩展,针对汉字的映射表),其实网络上的敏感词屏蔽机制就是利用了编码。

为什么 string 会设计成模板就是因为原本的 string 管理对象是 char 类型,能够很好的去兼容英文,但是像 gbk 编码的汉字就需要两个字符表示,这时就需要一个新的类来支持汉字,所以我们把 string 搞成模板就是为了适应不同的编码。

他虽然是模板,但是使用时不需要 .h 头文件,直接

#include

即可使用。他之所以不加 .h 就是因为C语言已经有一个 string.h 了,这里会产生冲突发生链接错误。当然直接使用 string 类型比如: string a 这种定义方式是错误的,因为C++标准库的东西都是放在 std 标准命名空间的。

对象的常见构造🤔

string 类对象的构造方法有上百种,我们不可能全部记住,重点记住几个重要常见的就行了
在这里插入图片描述

int main()
{
    string s1;
    string s2("hello world");
    string s3(s2);
    string s4 = s2;
    string s5("hello world",5);//前5个元素得到 hello
    string s6(10,'a')//初始化为10个a
    string s7(s2,6,3)//从 s2 的"w"开始向后拷贝3个
}

注意无参构造 s1 里面并不是什么都没有,从底层来讲 s1 底限也会有一个 ‘\0’ 在里面。

在 s7 这种构造里面,构造表达式为

string(const string& str,size_t pos,size_t len = npos);

这里的这个 npos 又是个啥?他是个半缺省的声明,这个 npos 其实是一个成员变量
在这里插入图片描述
这里的 static const size_t npos = -1,-1 的补码是全1,给到无符号数身上就是最大值,npos 内涵就是无符号数的上限范围 4294967295,你有多少就能给你取多少。

但是总的来说并不是内容越多越好,string 类的 106 种成员接口很多都让他在C++中显得非常冗余,陈皓老师的《STL的 string 类怎么啦》一文中就对他提出了批评。

string 的遍历🤔

其实上面对 string 的拷贝啥的都不是问题,真正的问题在于怎么去遍历 string 的每一个字符,比如我们需要做翻转 string 的操作。

遍历 string 有三种方式:

  1. 下标+[] 访问

和数组有异曲同工之妙,我们依然可以用循环的方式遍历他

for(size\_t= 0;i<s1.size();i++)
{
     cout<<s1[i]<<" ";
}

  1. 迭代器
string::iterator it = s1.begin()
while(it!=s1.end())
{
   cout<<\*it<<" ";
   ++it;
}

这里迭代器只做演示,后面我想专题讲解迭代器。现阶段可以认为它是个像指针或者就是指针的东西,s1 里面有一段空间,begin 返回里面内容的开头位置,而 end 不是最后一个数据而是最后一个数据的下一个位置,所以他是一个开区间,这里 while 为什么使用 != 而不用 < 呢, != 在这里是一种相对标准的语法,后面的链表或者 map,他们的迭代器并不是原生的而是封装的,用 < 就达不到目的了。

  1. 之前讲过的范围 for

范围 for 对于遍历确实方便,毕竟 auto 关键字可以自动识别类型,但是如果有需要进行走动(比如双指针靠拢的遍历)的场景就没什么大用了。

append🤔

我们在 string 里面插入单个字符或者批量初始化为同一个字符是可以的,那可不可以插入字符串呢?答案一定是可以的,我们引入了 append 接口。

append 也和 string 一样接口一大堆,所以我们依然取其精华去其糟粕

string& append (const string& str);
string& append (const char* s);

但是我想告诉你,append 并不是最佳人选,真正的利器是 operator+= ,可以直接进行各种操作,又好读又好写何乐不为。

s += 'a';
s += 'YiGuBiGu';
s += str;

getline🤔

虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。

当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。他的原型是:

istream& getline ( istream &is , string &str , char delim );

getline(cin,line)

这样就可以获得一个含有空格的字符串了,有人会误将 getline()作为while的判断语句,这样你会无法退出 while 循环!因为你的回车只会终止getline()函数的读入操作,getline()函数终止后又进行while()判断(即判断输入流是否有效,你的输入流当然有效,满足条件),所以又运行getline()函数。

string的拷贝🤔

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-w0CsBQpg-1713327421950)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值