图书网站建设费用明细滨州网站建设九鲁

当前位置: 首页 > news >正文

图书网站建设费用明细,滨州网站建设九鲁,手机建站的网站有哪些,建网站花费文章目录 STL简介一.认识string二.string中基本功能的使用总结STL简介 STL(standard template libaray-标准模板库)#xff1a;是C标准库的重要组成部分#xff0c;不仅是一个可复用的组件库#xff0c;而且是一个包罗数据结构与算法的软件框架。STL的版本 原始版本 Alexand…   文章目录 STL简介一.认识string二.string中基本功能的使用总结STL简介 STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架。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 SystemsInc公司开发继承自HP版 本。被GCC(Linux)采用可移植性好可公开、修改甚至贩卖从命名风格和编程 风格上看阅读性非常高。 STL的六大组件 仿函数空间配置器算法容器迭代器配接器。 STL的缺陷 1. STL库的更新太慢了。这个得严重吐槽上一版靠谱是C98中间的C03基本一些修订。C11出来已经相隔了13年STL才进一步更新。 2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。 3. STL极度的追求效率导致内部比较复杂。比如类型萃取迭代器萃取。 4. STL的使用会有代码膨胀的问题比如使用vector/vector/vector这样会生成多份代码当然这是模板语法本身导致的。 一、认识string 通过官方文档我们得知string的原型是basic_string的类模板。 我们发现wstring,u16string,u32string这些又是什么呢string的本质是一个管理字符的顺序表只不过里面存的都是1个char类型的字符而wstring里面存的是2字节的charu16string也是2个字节u32string是4个字节为什么会有这么多的差异呢因为我们有管理不同的字符数组的需求。在这里我们要了解ascll码用ascll编码可以在计算机里面存储和显示英文信息而在一开始的ascll码表中仅有128个值用7个比特位就可以代表这128个值了所以一开始的string中的字符仅为1个字节如下图 apple这个字符串存在char类型的数组中会消耗6个字节多出来的1个字节用来存放\0而字符a在ascll表中的值为97内存中的16进制61转换过来就是97所以字符确实是根据ascll的值在内存中一个一个存储的。而计算机不能只显示英文如果只能显示英文计算机又如何卖到中国呢所以为了显示其他国家的文字有人就发明了Unicode万国码能表示各个国家的文字Unicode又分为utf-8,utf-16,uft-32,他们三个的区别是每个字符的字节数不同比如utf-8的char就是1字节并且兼容ascll吗utf-16用16个比特位也就是2个字节utf-32则是4个字节表示一个字符。而string类就是因为这样的原因所以搞出了字节数不一样的模板。 总结

  1. 字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性。3. string类是使用char即作为它的字符类型使用它的默认char_traits和分配器类型。4. string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数。5. 注意这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节(而不是实际编码的字符)来操作。总结1. string是表示字符串的字符串类2. 该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。3. string在底层实际是basic_string模板类的别名typedef basic_stringchar, char_traits, allocator string;4. 不能操作多字节或者变长字符的序列。在使用string类时必须包含#include头文件以及using namespace std;二、string中基本功能的使用。 1.string的构造函数。 我们可以看到string的构造函数有7个不同的重载第一个可以直接定义一个字符串比如 我们可以发现一个空字符串里面是有一个\0的。 第二个可以直接用字符串初始化 第二个是我们使用最多也是最方便的。第三个给定一个字符串从这个字符串的某个位置及这个位置后面的len个长度初始化如下 len这个参数给了缺省值实际上如果我们不给len那么len默认就是nposnpos是size_t类型默认值是-1我们都知道size_t类型是无符号整形所以-1就是整形的最大值也就是说如果你不写这个参数那么自动将从pos位置开始后的所有字符进行构造。  第四个直接用字符串去构造。 这里发生了隐式类型转换将const char* 转换为string如果不想要编译器发生隐式类型转换我们可以在构造函数前面加上explicit这点我们在前面的类和对象文章讲过。 第五个给定一个字符串用它的前n个构造 第六个用n个字符去构造 第七个迭代器区间的构造 下面我们先来看string容量部分的函数 第一个size代表字符串的长度length与size一模一样。 那么为什么要设计一模一样的函数呢这里是因为c早期的历史遗留问题在没有STL之前是用length计算长度有了STL后要计算二叉树等再用长度这个名称就不合适了所以多加了一个函数size。 第二个max_size max_size就是字符串的最大长度它的理想是整形的最大值但实际上没有这么大因为要看堆的大小并且这个借口并没有什么很大的作用。 我们先讲第四个capacity capacity就是字符能存储多少个字节在这里需要注意的是capacity不包含\0也就是说如果字符串是“hello”那么capacity就是5不会再加上\0的一个字节大小。 第三个resize  第一个作用resize的作用是开空间并且初始化并且resize会改变size和capacity的大小。 我们可以看到s1的长度从11变成了50空间从15变成了63当然如果我们不主动初始化为某个字符会默认初始化为\0。 第二个作用当resize的大小比原来字符串的capacity要小那么resize就会将字符串中的字符缩减为resize的大小。 我们可以看到字符串只保留了前五个字符。 第五个reserve  开空间只改变capacity不改变size并且不会初始化。 第六个clear  清空字符串 可以看到字符串为空了。 第七个empty  判断字符串是否为空 接下来我们看string中的modify接口 这里我们就不按照顺序进行演示了因为有些接口不按照顺序效果会更好。 push_back  :尾插一个字符 append尾插一个字符串 第3个重载  这里也是有6个函数重载实在太过冗余所以我们就演示经常使用的。 第2个重载尾插一个字符串的从pos位置起的sublen个字符 第4个重载尾插一个字符串的前n个 第1个重载 当然以上的这些接口其实都不是很实用最实用的是操作符重载中的符号。 可以看到符号实在是太方便了。 insert:插入字符串或者字符 下面演示一下如何使用在第pos个位置插入一个string对象 在第pos个位置插入一个string对象的从subpos下标位置开始的sublen个字符 在第pos个位置插入一个字符串 在第pos个位置插入字符串的前n个。 当然我们是不推荐使用insert的因为插入要往后挪数据时间复杂度为ON。 有insert就会有erase我们看一下erase接口 从pos位置起删除len个字符 len有缺省值如果我们不传则从pos位置开始后面全删如下 接下来我们看一下replace接口 replace的重载太多了并且冗余我们会用一两个即可 上图是从下标为pos的位置开始的len个字符串。 我们先一下find接口 pos使用缺省值如果我们不写默认是0位置。 下面我们用find接口和replace接口做一道经典例题将空格替换为%20 看到以上的代码我们还能在优化一下吗答案是可以我们每次查找完一个空格就没必要再重头开始查找了我们从上一次的位置3开始查找即可为什么要3不是1呢因为我们替换了%20是3个字符 那么我们还能继续优化吗大家还记得我们讲的reserve函数吗我们可以提前开好空间避免在替换字符的过程中持续开空间浪费时间。 我们用另一种方法再做一次 这次的效率很明显是高于上面那种方式的当然这样的方式提前开好空间效率也会提升不少。 下面我们来看一下string中的字符串是如何扩容的 int main() {string s;size_t sz s.capacity();cout making s grow:\n;cout capacity changed: sz \n;for (int i 0; i 100; i){s.push_back©;if (sz ! s.capacity()){sz s.capacity();cout capacity changed: sz \n;}}return 0; } 我们可以看到在vs下是按照1.5倍进行扩容的。 接下来我们看一下一个字符串的大小 为什么一个空字符串的大小为28呢看下图 在VS下string的底层是这样实现的当字符串很小的时候就不用频繁的开空间了直接用数组即可当字符串很大就需要用_str开空间所以大小为28下面我们看看linux下的 同样的代码我们运行起来 我们发现在linux下是严格按照2倍扩容进行的而且字符串大小为8那么为什么linux下没有size和capacity变量呢因为linux下的string是按照写时拷贝实现的string对象内部只有一个指针8字节是因为在64位地址下该指针将来指向一块堆空间。 string迭代器的使用 要注意的是迭代器的区间是左闭右开的如下图 把begin给it这里的it就相当于指针只有解引用后才是指针指向的内容。而我们最喜欢使用的语法糖实际上就是用迭代器实现的并且这个实现非常的简单类似于宏替换。 通过汇编我们也可以看到范围for实际上去调用迭代器的begin和end函数了。 接下来我们看反向迭代器的使用 反向迭代器只需要在前面加上reverse即可相对应的begin和end前面也加上r需要注意的是反向迭代器原来的反方向还是向前走。 那么像下面这种情况该怎么办呢 这种情况下我们就不能调普通迭代器了我们需要调用const迭代器。如下 那么为什么存在const迭代器呢因为我们有时候是不希望别人修改我们的代码的。 正常的迭代器允许我们去修改但是const不行。 下面我们看一下string中用于访问的两个接口 那么这两个接口有什么区别呢 我们可以看到当用【】越界时会直接报错直接终止而at则是抛异常。 下面我们来看一下swap这个接口 string中的swap与std::swap是不一样的string中的swap是直接换指针的指向而std::swap则需要调用三次拷贝构造函数所以string中的swap的效率是更高的。 下面演示一下c_str这个接口 不知道大家是不是会有疑问c_str和直接打印有什么区别呢看下图 c_str是按字符串进行打印的也就是说遇到\0就停止。而直接打印是按照字节数也就是size去打印不去管\0. 接下来看substr这个接口 substr是取从pos位置开始的len个字符的子串。find函数我们前面讲过其实还有一个rfind函数find函数是从前往后找rfind函数是从后往前找。 可以看到我们成功取到了文件的后缀。 find_first_of:  从前往后查找任意一个出现在字符串内的字符 可以看到我们成功将abcd全部替换为*还有一个与之对应的函数find_first_not_of,这个接口的作用是找到不在字符串中任意一个字符的位置。如下图所示 可以看到这个接口与find_first_of是相反的。 find_last_of: 从后往前查找任意一个出现在字符串内的字符 同样还有一个find_last_not_of接口是与find_last_of是相反的 下面我们说一下字符串比较的几个接口这里的比较与C语言一样都是通过比较字符的ascll码值来确定大小的string中的接口compare是不经常用的我们直接看运算符重载 这里又再次说明了string中的接口是在太冗余了光是相等这个重载就有三个实在是不得不让人去吐槽。下面我们看怎么使用 也就是说我们可以直接对象与对象进行比较对象与字符串进行比较字符串与对象进行比较。后面的其他符号都与等于符号同理就不在一一演示了。 下面我们讲一下getline这个接口这个接口在写字符串类型的题目的时候非常有用 getline就是再我们用cin输入字符串的时候以换行作为结束标志遇到空格不会结束。为什么要说这个问题呢因为我们发现在做题的时候当输入一个字符串字符串中有多个空格的时候只会输出空格前的字符而空格会被留在缓冲区。getline的第一个参数为cin第二个参数为字符串。如下题 不通过的原因就是cin只识别了空格前面的字符下面我们用getline来试一下 看来getline成功解决了我们的问题所以在遇到这样输入带多个空格的字符串要用getline才可以。看到这里我们就已经把string的常用接口都演示了一遍string一共有一百多个接口而其实大部分都是冗余的平时用不上的接口大家就只需要把这个常用的接口用熟就能很好地使用string了。 总结 string中的重要接口有以下几个size()  reserve()   resize()  operator    c_str    find npos   以及比较操作符的重载当然即使会使用这些接口也很可能对接口云里雾里下一篇我们用c模拟实现一个string类届时大家可以更深刻的了解string。