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

阿里云上能建设自己的企业网站淘宝网页版官网入口

阿里云上能建设自己的企业网站,淘宝网页版官网入口,网站建设的编程,开发网站价格目录 1.STL简介1.1什么是STL1.2STL的版本1.3STL的六大组件1.4STL的缺陷 2.string类的使用2.1C语言中的字符串2.2标准库中的string类2.3string类的常用接口说明 #xff08;只讲解最常用的接口#xff09;2.3.1string类对象的常见构造2.3.2 string类对象的容量操作2.3.3string… 目录 1.STL简介1.1什么是STL1.2STL的版本1.3STL的六大组件1.4STL的缺陷 2.string类的使用2.1C语言中的字符串2.2标准库中的string类2.3string类的常用接口说明 只讲解最常用的接口2.3.1string类对象的常见构造2.3.2 string类对象的容量操作2.3.3string类对象的修改操作2.3.4 resize和reserve 2.3.5迭代器正向2.3.6 反向迭代器2.3.7const迭代器正向反向2.3.8 元素访问2.3.9 insert和erase2.3.10 replace、find、rfind、substr2.3.11 string::swap2.3.12 c_str2.3.13 getline 2.4 总结 1.STL简介 1.1什么是STL STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架。 1.2STL的版本 原始版本 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要阅读部分源代码 主要参考的就是这个版本。 1.3STL的六大组件 六大组件暂先了解后面会慢慢学习。 1.4STL的缺陷 STL库的更新太慢了。这个得严重吐槽上一版靠谱是C98中间的C03基本一些修订。C11出来已经相隔了13年STL才进一步更新。STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。STL极度的追求效率导致内部比较复杂。比如类型萃取迭代器萃取。STL的使用会有代码膨胀的问题比如使用vector/vector/vector这样会生成多份代码当然这是模板语法本身导致的。 2.string类的使用 2.1C语言中的字符串 C语言中字符串是以’\0’结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数 但是这些库函数与字符串是分离开的不太符合OOP思想(面向对象思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。 2.2标准库中的string类 string类其实是一个类模版实例化出来的模版类 string类的文档介绍 我们可以看到它其实是basic_string这个类模板实例化出来的类的一个typedef。 这里basic_string实例化出来的模板类除了string还有三个。 它们都是basic_string这个类模板实例化出来的模板类区别在于它们对应的模板参数的类型不同。 对于string类其实它的底层就是一个动态的字符数组 string就是一个char类型的字符数组 wstring就是对应的wchar_t的字符数组 u16string就是char16_t的字符数组 u32string就是char32_t的字符数组 这些不同类型的字符对应的大小也是不同的。 那么为什么要搞出这么多字符呢 这里实际上是因为ASCll码 这里面的所有符号和字母都一个对应的ASCII码值。 实际上内存里存的并不是字母本身而是它们对应的ASCII码值这里以16进制显示。 但是ASCII主要是来显示英语这些语言的并且世界上还有很多国家很多种语言比如现在我们要让计算机能显示中文用ASCII码就不行了啊、。 那基于这样的原因呢有人就又发明了Unicode——万国码兼容ASCII Unicode又进行了划分分为UTF-8、UTF-16、UTF-32这些。 所以呢为了应对这些不同的编码就产生了这些不同的字符类型所以就有了basic_string这个泛型字符串类模板我们可以用它实例化出不同类型的字符串类。 总结 string是表示字符串的字符串类该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名typedef basic_stringchar, char_traits, allocator string;不能操作多字节或者变长字符的序列。在使用string类时必须包含#include头文件以及using namespace std; 2.3string类的常用接口说明 只讲解最常用的接口 2.3.1string类对象的常见构造 constructor)函数名称功能说明string() (空字符串构造函数 默认构造函数 重点)构造一个空字符串长度为零个字符string(const char* s) (重点)用一个常量字符串来构造字符串类对象string (const string str, size_t pos, size_t len npos) 不经常使用复制 str 中从字符位置 pos 开始并跨越 len 字符的部分如果 str 太短或 len 是stringnpos则直到 str 的末尾string (const char* s, size_t n)拿s指向字符串的前n个字符去构造string对象string (size_t n, char c)拿n个字符c去构造string对象string (const string str)重点拷贝构造template string (InputIterator first, InputIterator last)迭代器之后讲解 下面我们开始逐个讲解 string() 这里我们构造了一个空字符串。 **string (const char* s) ** 这里还支持这样写 这里就是我们之前讲的单参数的构造函数是支持隐式类型转换的。 string (const string str, size_t pos, size_t len npos) 这里是拿str中的一个子串去构造string对象这个字串是从str中下标pos位置开始长度为len的一个字串。 如果这里的str比较短或者这里给的len是string::npos则这个字串一直到str的末尾。 举个简单的例子 这里的len是30那这里字符串的长度是不够的比30短但这里却不会报错这里会取到字符串的结尾位置。 这里如果给的len是string::npos也会一直到str末尾,并且这里len会给缺省值这个缺省值就是npos。 这里的npos是什么呢 它是一个静态成员变量值是-1但是这里它的类型是size_t无符号整型所以它在这里其实是整型的最大值。 string (const char* s, size_t n) 用s指向字符串的前n个字符去构造string对象 string (size_t n, char c) 用n个字符c去构造string对象 string (const string str) 拷贝构造 2.3.2 string类对象的容量操作 size和lengh 两者都是返回字符串长度。 这里你或许有疑问为什么功能一样却要写两个接口。 其实跟一些历史原因有关string出现的比STL早string严格来说是不属于STL的它是C标准库产生的在STL出现之前就存在了。 string最早之前设计的就是length但是后面STL出现之后里面的其它数据结构用的都是size那为了保持一致就给string也增加了一个size。 因此size()与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()。 max_size 它的作用是返回字符串可以达到的最大长度 实际上字符串并不能开这么长而且在不同平台下这个值是不一样。 capacity 这里就是返回当前string对象的容量即当前给它分配的空间有多大以字节表示 这里它是不包含给’\0’的空间的因为它认为’\0’不是有效字符。 其他的老铁可以暂时结合文档看一下重要的之后会给大家进行讲解。 2.3.3string类对象的修改操作 push_back 顾名思义push_back是尾插(追加1个字符的意思。 append 如果想追加一个字符串就可以用append 这里重载了很多版本但是最常用的呢其实还是直接去追加一个字符串 operator 实际上平常我们并不喜欢用push_back和append。而是去用 operator。 string重载了运算符重载之前文章有讲过用起来非常方便 2.3.4 resize和reserve 有了以上的知识我们回头再看 一下容量中的resize和reserve。 在此之前我们观察一下对于一个string对象在不断插入数据的过程中它是如何进行扩容的。 int main() {string s;size_t sz s.capacity();cout capacity changed: sz \n;for (int i 0; i 100; i){s.push_back(c);if (sz ! s.capacity()){sz s.capacity();cout capacity changed: sz \n;}}return 0; } 这里在VS code上几乎每次扩容都是2倍扩。 在这里简单了解过扩容机制之后我们来看一下reserve。reserve可以帮助我们更改容量大小这样如果我们知道需要多大的空间就可以一次开到位就不用再一次一次的扩容了。 我们现在指定reserve100个容量它不一定开的就是100可能由于对齐啊等等的一些原因它会给你多开一些空间但是肯定不会比100小。 如果我们知道需要多少空间reserve就可以帮助我们提前开辟好空间然后就可以减少扩容提升效率。 那resize又有什么作用呢 resize不仅可以开空间而且还能对开好的空间进行初始化。 这里我们没有指定第二个参数既要填入的字符默认给的是\0当然我们也可以自己指定要填入的字符 如果我们传的n小于当前字符串长度它还可以帮我们删除多出来的内容 注意这里只会改变sizecapacity并没有改变。 一般情况下是不会轻易缩容的缩容的话一般是不支持原地缩的由于底层内存管理的一些原因是没法原地缩的。 如果支持原地缩是不是就要支持释放一部分我们申请一块空间不用了只释放其中的一部分。 但是是不支持只释放一部分的就像我们free是不是要求传的指针必须是指向其实位置的。 所以如果真的要缩容的话只能异地缩就是开一块新的小空间把需要的数据拷贝过去然后把原空间释放掉。所以缩容是要付出性能的代价的系统原生是不支持的我们需要自己去搞。所以不到万不得已不要轻易缩容。 2.3.5迭代器正向 现在我们想遍历一个string对象首先可以循环用[ ]遍历因为string是重载了[ ]的或者我也可以用范围for。除了这些方法外我们还可以用迭代器。 我们举个简单的例子 int main() {string s1(hello world);string::iterator it s1.begin();while (it ! s1.end()){cout *it ;it;}return 0; } 这里的it就是我们定义的一个string类的迭代器string::iterator是类型现阶段呢大家可以认为迭代器是一个像指针一样的东西不一定是指针。 这里的begin会返回指向字符串第一个字符的迭代器。 这里的end会返回指向最后一个字符后面位置的迭代器。 我们可以理解成这样两个位置的指针 2.3.6 反向迭代器 迭代器除了像上面那样支持正向从前向后遍历也支持反向遍历反向遍历的叫做反向迭代器。 这里的rbegin()返回指向字符串最后一个字符的反向迭代器。 这里的rend()返回一个反向迭代器迭代器指向字符串第一个字符的前一个。 下面我们再来看之前的例子: int main() {string s1(hello world);string::reverse_iterator it s1.rbegin();while (it ! s1.rend()){cout *it ;it;}return 0; }2.3.7const迭代器正向反向 对于const对象不能被修改那么普通迭代器可以认为它是一个像指针一样的东西那我们对它解引用就不可以修改它所以这里我们就不能用普通迭代器会造成权限放大。 我们看到begin()如果是const对象调用begin那么返回的是const迭代器const_iterator,普通迭代器可以读改数据但是const迭代器就只能读不能修改。 const反向迭代器就是const对象调用rbegin()和rend()返回的迭代器const_reverse_iterator 这里C11又提供了一套迭代器cbegin cend crbegin crend它们只返回const迭代器。 2.3.8 元素访问 string是重载了[]的我们可以直接用 operator[]也是有普通版本和const版本的普通对象调[]就返回char const对象就返回const char不能修改。 at作用跟[]是一样的。但是呢它们两个还是有区别的区别在于 用[]如果越界访问的话是直接报错的它内部是断言去判断的。at是抛异常 back和front作用是返回最后一个和第一个字符但是这个我们用[]就能搞定所以大家简单了解一下就行了。 2.3.9 insert和erase 使用insert我们可以向string对象中插入字符和字符串 这里insert提供了好几个版本我们只需要掌握几个常用的就好。 现在我们想在world前面插入一个字符串hello我们就可以考虑用这个 第一个参数是插入的位置第二个是插入的字符串。 现在我们想在第五个位置插入1个空格可以用这个 我们还可以考虑使用迭代器 注意 对于string来说我们不推荐频繁使用insert。因为string底层是字符数组那我们学过数据结构知道在顺序表里插入元素需要要挪动数据效率是比较低的。 我们再来看一下erase erase是删除string对象里的元素。 举个简单的例子 现在我们可以利用erase删除后面的空格 2.3.10 replace、find、rfind、substr 我们来看一下replace replace作用其实就是把字符串的一部分替换成新的内容。这里我们同样挑常用的讲解。 我们举个例子 现在我们要把s里的空格替换成“hhh” 我们再看一下find find可以在字符串里查找字串或者字符返回对应的下标。找不到返回npos 再来举个例子 现在想在s里查找“w” 我们再来看rfind find是从前往后找第一个匹配项rfind是从后往前找倒数第一个匹配项 我们再来看substr substr可以帮助我们获取string对象中指定的一个子串。 举个例子 这里我们获取了第六个位置开始长度为五的子串。 2.3.11 string::swap 和标准库里的swap不同的是这里的swap接收一个string对象与当前对象进行交换。 2.3.12 c_str 我们再来看一下c_str: 它的作用是返回一个指向当前string对象对应的字符数组的指针类型为const char*。 2.3.13 getline 我们举个例子 int main() {string s;cin s;cout s endl;return 0; } 现在我想输入hello world 能正常输出吗 这里的cin我们在用它们输入的时候是有可能输入多个值的那当我们输入多个值的时候它们默认是以空格或者换行来区分我们输入的多个值的。 所以我们这里输入的hello world会被认为是两个值以空格分隔开所以cin值读到了空格前面的hello后面的world就被留在缓冲区了。 我们可以用getline解决这种问题 getline它读取到空格才结束当然它还支持我们自己指定结束符。第一个参数就是接收cin第二个参数接收我们要输入的string对象。 2.4 总结 这里关于string的常用接口就讲的差不多了这里string的接口很多如果后面有遇到不清楚的这里建议大家去阅读官方文档 string
http://www.hkea.cn/news/14574258/

相关文章:

  • 桂林旅游网站建设引流推广营销
  • 电商在线设计网站html网站免费模板下载
  • 建设网站的申请信用卡分期idea 网站开发
  • 动漫网站源码免费南京比较好的软件公司
  • 互联网运营网站烟台高新区规划国土建设局网站
  • 企业网站 制作华为仓颉编程语言
  • 建立网站第一步怎么做洛阳便宜网站建设公司
  • 昭通网站开发公司影视网站如何做seo
  • 网站建设总体说明书益阳做网站怎么便宜
  • 怎么给网站做快照整个网站与网站模板的区别
  • 有个新网站专门做外贸的叫什么比较好的h5网站
  • 网站换空间有影响吗免费 网站 空间
  • 海报设计素材网站免费门户网站建设费用科目
  • 邓州市建设局网站国际物流东莞网站建设
  • erlang做网站优势网站优化培训班
  • 建设网站需要哪些手续教学网站开发源码
  • 方正网站制作电子商务网站开发软件
  • 天津电商网站制作泉州网站建设托管
  • wordpress无刷新分页济南官网seo推广
  • 手机设计企业网站做网站的系统功能需求
  • 东莞海天网站建设有什的自学做网站
  • 手机触屏网站幻灯片常见门户网站的基本功能
  • 高端品牌网站建设集团温州营销网站公司哪家好
  • 建设银行 钓鱼网站下面哪个是h5轻设计平台
  • 徐州建设网站资源下载wordpress
  • 怎么把网站源码扒下来门户网站的特征
  • 网站建设要多少费用做推广哪个平台好
  • c 做商务网站方便吗个人简历可编辑免费
  • 小学学校网站模板免费下载大兴安岭网站建设
  • 什么系统做购物网站好网站前台代码