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

娱乐网站模板互联网营销师培训机构哪家好

娱乐网站模板,互联网营销师培训机构哪家好,推广赚佣金的软件排名,平台式网站目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类#xff1f; 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象… 目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象的访问及遍历操作 5.3.4 string类对象的修改操作 5.3.4 string类非成员函数 ​编辑 总结 前言 大家好呀失踪两个月的博主回来了不要问博主去干什么了问就是去修炼内功心法去了时至今日按照我们之前的更新进度我们应该进入到我们stl的相关内容的学习。那么我们今天就从string开始逐渐给大家介绍我们的stl的内容但是在介绍之前我们先笼统的了解一下我们stl的内容。 1.什么是STL STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架。 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 SystemsInc公司开发继承自HP版 本。被GCC(Linux)采用可移植性好可公开、修改甚至贩卖从命名风格和编程 风格上看阅读性非常高。我们后面学习STL要阅读部分源代码STL是规范他有很多版本其底层实现大同小异但对于某些接口其还是有着不同的主要参考的就是这个版本。 3. STL的六大组件 这里的容器就是我们的数据结构然后空间适配器就是我们的内存池。 4.STL的缺陷 1. STL库的更新太慢了。这个得严重吐槽上一版靠谱是C98中间的C03基本一些修订。C11出来已经相隔了13年STL才进一步更新。 2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。 3. STL极度的追求效率导致内部比较复杂。比如类型萃取迭代器萃取。 4. STL的使用会有代码膨胀的问题比如使用vector/vector/vector这样会生成多份代码当然这是模板语法本身导致的。 5.string 5.1 为什么学习string类 5.1.1 C语言中的字符串 C语言中字符串是以\0结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数但是这些库函数与字符串是分离开的不太符合OOP(面向对象)的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。 5.2 标准库中的string类 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性。 3. string类是使用char(即作为它的字符类型使用它的默认char_traits和分配器类型(关于模板的更多信息请参阅basic_string)。 4. string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参basic_string)。 5. 注意这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节(而不是实际编码的字符)来操作 总结 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作 3. string在底层实际是basic_string模板类的别名typedef basic_stringchar, char_traits, allocator  string; 4. 不能操作多字节或者变长字符的序列。 5.3 string类的常用接口的使用 注意小编介绍的都是我们常用接口对于具体的还需要我们自己去查阅文档进行深度学习。 5.3.1 构造函数 这里我们常用的就这几个这里我们简单给大家演示一下该使用 #includeiostream #includestring//使用记得包文件 using namespace std; int main() {string s1; // 构造空的string类对象s1string s2(hello xhj); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3string s4(10, c);//使用n个字符构造我们的对象//注意我这里打印是需要重载我们的流插入操作符的之后我们也会在对string类的实现给大家介绍//这里为了大家更加直观的感受我们这里先直接使用即可cout s1 endl;//在有些编译器下就算访问到string类的‘\0其也不会显示的打印出来。cout s2 endl;cout s3 endl;cout s4 endl;return 0; } 结果展示 5.3.2 string类对象的容量操作 注意 1. size()与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()。max_size这个接口不同编译器是不同的结果所以该使用是没有很大意义的 2. clear()只是将string中有效字符清空不改变底层空间大小。 3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用/0来填充多出的元素空间size也会发生改变resize(size_t n, char c)用字符c来填充多出的元素空间。注意resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变。因为对于缩容来讲是有代价的在我们学习中并没有对一块空间部分释放的函数系统不支持分段释放空间所以该实际上进行的操作其实是将数据内容拷贝到一个新的缩小后的·空间 4. reserve(size_t res_arg0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserve改不改变取决于不同的编译器和我们string类中是否有数据也有可能不缩小该不具有约束力。 对于reserve来讲不同的编译器对于编译过程中的扩容机制是不一样的对于vs是在原来的基础上加上扩容的大小Linux下是直接扩到指定大小但该本质上都不会小于我们要求的大小 此外这里我们的shrink_to_fit,这个函数的作用是将string的capacity减到size大小但是这个函数是不具有约束力的所以这里也不一定会缩到size大小这里我们做个简单的了解即可。 代码演示 #includeiostream #includestring//使用记得包文件 using namespace std; int main() {string s1;s1.reserve(100);//开容量cout s1.size() endl;cout s1.capacity() endl;s1.resize(10);//开有效数据的空间cout s1.size() endl;cout s1.capacity() endl;s1.clear();//清空有效数据cout s1.size() endl;cout s1.capacity() endl; } 结果 5.3.3 string类对象的访问及遍历操作 这里我们的遍历方式是有多种的但是对于该底层如何是实现的我们待会再了解这里先给大家演示一下该遍历方式 #includeiostream #includestring//使用记得包文件 using namespace std; int main() {string s1(hello world!);//[]遍历for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;//正向迭代器的遍历string::iterator it s1.begin();while (it ! s1.end()){cout *it ;it;}cout endl;//反向迭代器的遍历string::reverse_iterator it1 s1.rbegin();while (it1 ! s1.rend()){cout *it1 ;it1;}cout endl;//范围forfor (auto e : s1){cout e ;}cout endl; } 结果展示 这里我们可以看到反向迭代器是一种从后往前的遍历方式至于该具体实现我们以后再和大家讲解。此外我们需要了解一下以下的相关知识 1.对于,[]我们出现数组越界采用的是断言的方式去进行处理的 2.对于内置类型和自定义类型该[],是具有本质的区别的对于内置类型该是一个解引用操作也就是 *(ai),但是对于内置类型其实s.operator[](i);,因此对于我们的自定义类型我们是需要对其进行运算符重载的。 3.迭代器任何容器都支持迭代器并且用法都是类似的而我们的[]只支持底层是数组的容器 对于迭代器上面我们只讲述了该用法但是对于迭代器我们需要了解更多一点该相关内容 literator提供一种统一的方式访问和修改容器数据 算法可以通过迭代器去处理容器中数据 此外我们的迭代器一共分为四种 一种是普通变量的正向迭代器一种是const变量的正向迭代器对于const变量我们只能使用const迭代器涉及到我们的权限问题而且我们的普通变量的迭代器可以读写而我们的const迭代器只能读取 另外两种就是反项的两个迭代器 5.3.4 string类对象的修改操作 这里我们的append和我们的的效果是一样的都可以起到在我们对象后面加上一个字符串和单个字符的效果这是由于函数重载得到的而我们的push_back只能在后面加上一个字符。 因此 1. 在string尾部追加字符时s.push_back(c) / s.append(1, c) / s c三种的实现方式差不多一般情况下string类的操作用的比较多操作不仅可以连接单个字符还可以连接字符串。 2. 对string操作时如果能够大概预估到放多少字符可以先通过reserve把空间预留好。(编译器也会自动扩容但是我们知道数据个数的情况下会直接扩容会减少成本) 这里简单的给大家演示一下这三个函数的使用方式 #includeiostream #includestring//使用记得包文件 using namespace std; int main() {string s1(hello);s1 w;string s2(hello);s2.append(1,w);string s3(hello);s3.push_back(w);cout s1 endl;cout s2 endl;cout s3 endl;string s4(hello);string s5(hello);s4.append(world);s5 world;cout s4 endl;cout s5 endl;return 0; } 结果如下 这里我们的inserterase以及我们的replace我们都不是经常使用这里原因是由于这里带来的效率过于低下那么我们只需要对其做个简单的认识即可。 insert insert的作用是在我们指定的位置进行插入这里有一个下标版本和一个迭代器版本但是不建议经常使用insert因为这里涉及到效率的问题 erase 这里我们的npos是 这里指的是一个静态成员实际上该是无符号数的-1也就是说使用该值后就会自动删除pos位置后的所有字符。 erase由于是在中间或者头部删除数据的所以效率也是比较低的我们不推荐。 replace 对于替换这个函数我们这里也不常使用因为这里需要消耗的代价太大。 这里我们就简单的给大家简单的演示一下该使用方式即可 #includeiostream #includestring//使用记得包文件 using namespace std; int main() {string s1(hello);s1.insert(2, xxx);cout s1 endl;s1.erase(2, 3);cout s1 endl;s1.replace(0, 5, world);cout s1 endl;return 0; } 运行结果如下 然后就是我们的pop_back了这里就是将最后的一个字符删除即可大家可以自己演示一下。 接下来我们需要了解的一个接口是我们的c_str这里返回的是C语言形式的字符串那么具体需要了解该是什么我们需要看一下一下一段代码 这里的couts1endl;和couts1.c_str();这两个得到的值是一致的但实际上该一个是流提取操作符的重载一个相当于打印的是char*(也就是返回C语言的字符串因此这个函数的作用是将C语言和c进行有些接口进行配合) 紧接着我们需要了解的是我们的find接口和我们的rfind接口 这里注意我们的主要作用是从字符串pos位置开始往后找字符c返回该字符在字符串中的位置 这里注意其返回值是 与此同时我们的rfind的作用是从字符串pos位置开始往前找字符c返回该字符在字符串中的位置 这里我们的find和我们的rfind的使用方式是一致的那么我们这里就给大家演示其中一个的使用方式。 最后一个我们经常使用的接口就是substr,该作用就是在str中从pos位置开始截取n个字符然后将其返回。 这里我们返回的也是一个string对象该使用方式如下 5.3.4 string类非成员函数 这里我只给大家介绍一个getline接口对于其他接口我们在进行模拟实现后大家就可以轻而易举的理解了。 理解我们的getline首先我们需要知道一个小的知识点这里我们配合一段代码讲解一下 #includeiostream #includestring//使用记得包文件 using namespace std; int main() {string s1;cin s1;cout s1;return 0; } 运行结果 这里我们输入的明明是我们的hello world但是实际上我们s1是hello那么是什么原因导致这样呢 这是由于cin在逐个输入数据时是以空格或者换行来辨别数据的所以在逐个输入数据时我们的空格或者换行是不能被读取的如果我们想要读取换行就需要使用到istream中的getline函数 getline是非成员函数进行的是输入操作默认这里遇到换行符结束输入字符串。 这里我给大家简单的演示一下 文章最后我们需要了解的是与我们string相关的最后一类接口 这里就不给大家一个一个具体介绍了这里大家需要记住的是我们经常使用的两个 我们的to_string就是将我们其他类型转换为我们的string类型我们的stoi就是将我们的string类型转化为我们的整型。 总结 到这里我们对string各个常用接口的介绍已经到这里了但是我们一定要经常使用才会铭记于心后续为了加强大家的理解小编会给大家带来我们string类的相关模拟实现。请大家敬请期待。
http://www.dnsts.com.cn/news/196454.html

相关文章:

  • 诸城哪有做公司网站和的广东省app开发公司
  • 如何建设网站盈利小区百货店网怎么做网站
  • 单页网站建站建站行业消失了吗
  • 湖北网站设计制作开发兴义市建设局网站首页
  • 贵阳餐饮网站建设优化建站
  • 网站的弹窗是怎么做的白云做网站要多少钱
  • 什么是网站的入口广州市手机网站建设品牌
  • 用python开发网站开发技术东莞网站建设17
  • cms 开源seo推广特点
  • 怎么把自己做的网站放到百度上引擎搜索优化
  • 防盗报警网站建设wordpress 编辑主题 保存
  • 网站数据怎么会丢失公司做网站让我们销售
  • 网站建设汇报稿广西南宁最新新闻事件
  • 许昌购物网站开发设计灵璧做网站公司
  • 网站挣钱怎么做黄埔商城网站建设
  • 网站后台模块wordpress输出标签下文章
  • 物流公司取名字参考大全做网络优化的公司排名
  • 商丘网站建设价格在xampp下搭建本地网站
  • 网站建设产品展示型的php网站开发门槛高吗
  • 高校后勤网站建设网站建设运用的技术
  • 网站 head关键字 密度 多少字北京到广州飞机
  • 智慧旅游门户网站建设方案wordpress投票插件wp-polls
  • 合肥网站建设 合肥网络推广自适应手机网站开发
  • 北京网站建设公司报价广告软文小故事800字
  • 网站 功能建设上 不足seo网站优化策划书
  • 购物网站制作费用加强政务公开网站建设
  • 网站做的很差的案例下载ps软件免费版
  • 临沂网站案例lnmp wordpress tp
  • 郑州网站推广策行业门户网站建站
  • 上海企业建站流程室内设计效果图软件手机版