外贸网站建设推广优化,网站400,博宇娱乐网站建设,建筑企业公司朋友们、伙计们#xff0c;我们又见面了#xff0c;本期来给大家解读一下有关Linux的基础知识点#xff0c;如果看完之后对你有一定的启发#xff0c;那么请留下你的三连#xff0c;祝大家心想事成#xff01; C 语 言 专 栏#xff1a;C语言#xff1a;从入门到精通 数… 朋友们、伙计们我们又见面了本期来给大家解读一下有关Linux的基础知识点如果看完之后对你有一定的启发那么请留下你的三连祝大家心想事成 C 语 言 专 栏C语言从入门到精通 数据结构专栏数据结构 个 人 主 页 stackY、 C 专 栏 C Linux 专 栏 Linux
目录 1. 什么是STL
2. STL六大组件
3. 标准库中的string类
3.1string类
4. string类的常用接口
4.1string类对象的常见构造
4.2string类对象的容量操作
4.3string类对象的访问及遍历操作
4.4string类对象的修改操作
4.5string的非成员函数
5. vs和g下string结构的说明
5.1vs下的string结构
5.2g下string结构 1. 什么是STL STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架。 2. STL六大组件 3. 标准库中的string类 string类的文档介绍 3.1string类 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. 不能操作多字节或者变长字符的序列。 在使用string类时必须包含#include头文件以及using namespace std; 4. string类的常用接口 关于string类中的接口有许多许多在这里只介绍最常用的接口。 4.1string类对象的常见构造 string类构造的参考文档 string() 构造空的string类对象即空字符串 string(const char* s) 用C-string来构造string类对象 string(size_t n, char c) string类对象中包含n个字符c string(const strings) 拷贝构造函数 void Teststring()
{string s1; //空字符串string s2(hello world!); //字符串构造string s3(10, x); //字符构造string s4(s2); //拷贝构造s2
} 4.2string类对象的容量操作
size返回字符串有效字符长度length返回字符串有效字符长度capacity返回空间总大小empty 检测字符串是否为空串是返回true否则返回falseclear 清空有效字符reserve 为字符串预留空间**resize re将有效字符的个数改成n个多出的空间用字符c填充 1. size、length、capacity、clear、empty void Teststring_capacity1()
{string s(Hello World!!);//字符串的有效长度cout s.size() endl; //这两个计算出来的结果都不包含\0cout s.length() endl;//s的容量cout s.capacity() endl;//判空cout s.empty() endl;//清理数据但不释放空间s.clear();cout s.empty() endl;cout s.capacity() endl;
} 2. resize void Teststring_capacity2()
{string s(Hello World!!);//1. 指定字符//多出来的空间用指定字符填充s.resize(20, x);cout s endl;//2. resize大小小于sizes.resize(11);cout s.size() endl;cout s endl;//3. resize大于size// 多出来的空间使用\0填充s.resize(20);cout s.size() endl;
} 3. reserve void Teststring_capacity3()
{string s(xxx);cout s.size() endl;cout s.capacity() endl;//扩容的空间小于预留空间则不会改变s.reserve(10);cout s.size() endl;cout s.capacity() endl;s.reserve(20);cout s.size() endl;cout s.capacity() endl;
} 总结 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 n 0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小。 4.3string类对象的访问及遍历操作
operator[ ] 返回pos位置的字符const string类对象调用begin endbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭 代器rbegin rendbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭 代器范围forC11支持更简洁的范围for的新遍历方式 1. operator[ ] void Teststring_access1()
{string s1(Hello World);string s2 Hello World!!!; //遍历s1for (size_t i 0; i s1.size(); i){//读cout s1[i];}cout endl;//遍历s2for (size_t i 0; i s2.size(); i){//读cout s2[i];}cout endl;
} 2. 迭代器 和 begin end、rbegin rend void Teststring_access2()
{string s Hello World!;//正向迭代器string::iterator it s.begin();//auto it s.begin(); //使用auto自动识别类型while (it ! s.end()){//读cout *it;it;}cout endl;//反向迭代器string::reverse_iterator rit s.rbegin();//auto rit s.rbegin(); //使用auto自动识别类型while (rit ! s.rend()){//读cout *rit;rit;}cout endl;
}迭代器默认是可以进行读和写 void Teststring_access3()
{string s Hello World!;//遍历for (size_t i 0; i s.size(); i){//写s[i];cout s[i];}cout endl;//迭代器string::iterator it s.begin();while (it ! s.end()){//写*it x;it;}cout s endl;
} 3. 范围for void Teststring_access4()
{string s Hello World!;// 原理编译器编译器替换成迭代器//范围forfor (auto ch : s){//读cout ch;}cout endl;//范围forfor (auto ch : s){//写ch;}cout s endl;
}4.4string类对象的修改操作
push_back在字符串后尾插字符cappend在字符串后追加一个字符串operator 在字符串后追加字符串strc_str返回C格式字符串find npos从字符串pos位置开始往后找字符c返回该字符在字符串中的位置rfind从字符串pos位置开始往前找字符c返回该字符在字符串中的位置substr在str中从pos位置开始截取n个字符然后将其返回 1. 头插、追加、尾删 void Test_modify1()
{string s;//尾插s.push_back(H);s.push_back(e);cout s endl;//追加s llo;s.append( World!);cout s endl;//尾删删除s.pop_back();cout s endl;
}2.c_str、npos、substr、find void Test_modify2()
{string s Hello World!;//返回C格式的字符串cout s.c_str() endl;size_t pos s.find(!);//s[pos];cout s.c_str() endl;cout s.substr(2, 5) endl;cout s.substr() endl;//不传参默认从头开始一直截取到尾
} 注意 1. 在string尾部追加字符时s.push_back(c) / s.append(1, c) / s c三种的实现方式差不多一般情况下string类的操作用的比较多操作不仅可以连接单个字符还可以连接字符串。 2. 对string操作时如果能够大概预估到放多少字符可以先通过reserve把空间预留好。 4.5string的非成员函数
函数功能说明operator尽量少用因为传值返回导致深拷贝效率低operator 输入运算符重载operator 输出运算符重载getline 获取一行字符串relational operators 大小比较 string非成员函数相关接口查看的文档 在string中是支持流插入和流提取因为string中将 和 运算符重载了 void Test()
{string s;//输入cin s;//输出cout s endl;
} getline可以获取一行的字符串并不会因为遇到空格而停下来 void Test2()
{string s;//输入getline(cin, s);cout s endl;
} 5. vs和g下string结构的说明 注意下述结构是在32位平台下进行验证32位平台下指针占4个字节 5.1vs下的string结构 string总共占28个字节内部结构稍微复杂一点先是有一个联合体联合体用来定义string中字符串的存储空间 当字符串长度小于16时使用内部固定的字符数组来存放当字符串长度大于等于16时从堆上开辟空间 union _Bxty{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing} _Bx;1 2 3 4 5 6 这种设计也是有一定道理的大多数情况下字符串的长度都小于16那string对象创建好之后内部已经有了16个字符数组的固定空间不需要通过堆创建效率高。其次还有一个size_t字段保存字符串长度一个size_t字段保存从堆上开辟空间总的容量最后还有一个指针做一些其他事情。 故总共占1644428个字节。 5.2g下string结构 G下string是通过写时拷贝实现的string对象总共占4个字节内部只包含了一个指针该指针将来指向一块堆空间内部包含了如下字段 空间总大小字符串有效长度引用计数 struct _Rep_base
{size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount;
}; 指向堆空间的指针用来存储字符串 朋友们、伙计们美好的时光总是短暂的我们本期的的分享就到此结束欲知后事如何请听下回分解~最后看完别忘了留下你们弥足珍贵的三连喔感谢大家的支持