网站备案查询不了,宁波十大外贸公司,做网站要排版吗,网站建设开发实训报告总结1. 为什么要学习string类
1.1 C语言中的字符串
C语言中#xff0c;字符串是以\0结尾的一些字符的集合#xff0c;为了操作方便#xff0c;C标准库中提供了一些str系列 库函数#xff0c;但是这些库函数与字符串是分离开的#xff0c;不太符合OOP的思想#xff0c;而且…1. 为什么要学习string类
1.1 C语言中的字符串
C语言中字符串是以\0结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列 库函数但是这些库函数与字符串是分离开的不太符合OOP的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问
1.2 OJ中有关字符串的题目 在OJ中有关字符串的题目基本以string类的形式出现而且在常规工作中为了简单、方便、快捷基本都使用string类很少有人去使用C库中的字符串操作函数 2. 标准库中的string类
2.1 string类(了解)
string类的文档介绍https://cplusplus.com/reference/string/string/?kwstring
字符串是表示字符序列的类 标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性string类是使用char(即作为它的字符类型使用它的默认char_traits和分配器类型(关于模板的更多信息请参阅basic_string)string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)注意这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节(而不是实际编码的字符)来操作 总结 string是表示字符串的字符串类 该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作string在底层实际是basic_string模板类的别名typedef basic_stringchar, char_traits, allocatorstring; 不能操作多字节或者变长字符的序列 在使用string类时必须包含#include头文件以及using namespace std; 2.2 string类的常用接口说明 1. string类对象的常见构造 void Teststring()
{string s1; // 构造空的string类对象s1string s2(hello bit); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3
} 2. string类对象的容量操作 注意 size()与length()方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()clear()只是将string中有效字符清空不改变底层空间大小resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用0来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间。注意resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变reserve(size_t res_arg0)为string预留空间不改变有效元素个数当reserve的参数小于 string的底层空间总大小时reserver不会改变容量大小 3. string类对象的访问及遍历操作 4. string类对象的修改操作 注意 在string尾部追加字符时s.push_back(c) / s.append(1, c) / s c三种的实现方式差不多一般情况下string类的操作用的比较多操作不仅可以连接单个字符还可以连接字符串对string操作时如果能够大概预估到放多少字符可以先通过reserve把空间预留好 5. string类非成员函数 6. vs和g下string结构的说明
注意下述结构是在32位平台下进行验证32位平台下指针占4个字节
1.vs下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;
这种设计也是有一定道理的大多数情况下字符串的长度都小于16那string对象创建好之后内部已经有了16个字符数组的固定空间不需要通过堆创建效率高
其次还有一个size_t字段保存字符串长度一个
size_t字段保存从堆上开辟空间总的容量
最后还有一个指针做一些其他事情
故总共占1644428个字节 2.g下string的结构
G下string是通过写时拷贝实现的string对象总共占4个字节内部只包含了一个指针该指针将来指向一块堆空间内部包含了如下字段
空间总大小 字符串有效长度 引用计数 指向堆空间的指针用来存储字符串
struct _Rep_base
{size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount;
};