什么网站做班服比较好,免费游戏直接能玩,上海中心设计公司是谁,麦包包在网站建设方面个人主页~ string 一、标准库中的string类1、什么是string类2、string类的常用接口讲解#xff08;1#xff09;string类的常见构造#xff08;2#xff09;string类的容量操作#xff08;3#xff09;string类对象的访问及遍历#xff08;4#xff09;string类对象的修…
个人主页~ string 一、标准库中的string类1、什么是string类2、string类的常用接口讲解1string类的常见构造2string类的容量操作3string类对象的访问及遍历4string类对象的修改5string类非成员函数6其他7vs和g下string结构说明vs下的string结构g下string结构 一、标准库中的string类
1、什么是string类
1字符串是表示字符序列的类string是表示字符串的字符串类 2标准的字符串提供了对此类对象的支持其接口类似于标准字符容器的接口与常规容器的接口基本相同但添加了专门用于操作单字节字符字符串的设计特性也就是专门用来操作string的常规操作 3string类是使用char作为它的字符类型 4string类是basic_string模版类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数
basic_stringchar s1;
string s2;
//这两个是一样的string就是basic_string的char类型特化
typedef basic_stringchar, char_traits, allocator string;//底层5不能操作多字节或者变长字符的序列 6在使用时要包头文件以及展开命名空间
2、string类的常用接口讲解
1string类的常见构造
函数名称功能说明string()构造空的字符串string(const char* s)用C格式的字符串构造字符串string(const string s)拷贝构造函数string(size_t n,char c)字符串中包含n个字符c
void test()
{string s1;string s2(hello world);string s3(s2);string s4(5, a);
}2string类的容量操作
函数名称功能说明size返回字符串有效字符长度empty检测字符串是否为空是返回true否返回falseclear清空有效字符reserve为字符串预留空间resize将有效字符个数改为n个多出的空间用字符c填充capacity总空间大小length返回字符串有效字符长度
void test2()
{string s1(hello world);cout s1 endl;//测试size和lengthcout s1.size() endl;cout s1.length() endl;//size和length底层实现原理完全相同在刚刚创造出string的时候对于字符串来说叫length很合适//所以起名为length但不久后STL产生了为了与其他的模版比如listvector等统一,//所以加了size,保持接口一致性一般都用size//测emptycout s1.empty() endl;//测capacitycout s1.capacity() endl;//测resizes1.resize(5, a);cout s1 endl;s1.resize(15, a);cout s1 endl;//resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改到n个//不同的是当字符个数增多时resize(size_t n)用0来填充多出的元素空间//resize(size_t n,char c)用c字符填充多出的元素空间//resize改变元素个数时如果个数增多可能会改变底层容量的大小如果减少则不变//测reserves1.reserve(15);cout s1.capacity() endl;//为string预留空间如果reserve的参数小于string的底层空间总大小时reserve不会改变容量大小//测clears1.clear();cout s1.capacity() endl;s1 little monster;//在后边有讲解cout s1 endl;//clear只是将string中有效字符清空不改变底层大小可以再键入新内容
}3string类对象的访问及遍历
函数名称功能说明operator[ ]返回pos位置的字符const string类调用begin 和 endbegin获取一个字符的迭代器end获取最后一个字符的后一个位置的迭代器rbegin 和 rendrbegin获取一个字符的迭代器rend获取最后一个字符的后一个位置的迭代器范围for更简洁的遍历
void test3()
{string s1(hello world);cout s1[6] endl;//使用下标操作符[]可以直接找到对应位置的字符//string::iterator it s1.begin();auto it s1.begin();//这里体现出了auto的优越性上面一长串的类型可以直接用auto推导代替for (it; it ! s1.end(); it){cout *it ;}cout endl;
//begin记录第一个有效字符的位置end记录最后一个有效字符的后一个位置
//从头到尾的打印是一个重载运算符在其他类中包括链表类也可以直接找到下一个成员for (auto it : s1){cout it ;}cout endl;
//使用范围for进行遍历十分方便auto rit s1.rbegin();for (rit; rit ! s1.rend(); rit){cout *rit ;}
//rbegin和rend是一对与begin和end相反的函数rbegin记录的是最后一个有效字符的位置rend记录的是第一个有效字符的前一个位置通过实现逆向输出
}4string类对象的修改
函数名称功能说明operator在字符串后追加字符串c_str返回C格式字符串find从字符串pos位置开始往后找字符c返回该字符在字符串中的位置push_back在字符串后尾插字符append在字符串后追加一个字符串rfind从字符串pos位置开始往前找字符c返回该字符在字符串中的位置substr在str中从pos位置开始截取n个字符然后将其返回
void test4()
{string s1(hello world);//测试s1 !!!!;cout s1 endl;//c_str测试cout s1.c_str() endl;//c_str就是将c的格式转化为c语言的格式这样字符串就可以用C语言的方式来操作//并且c_str返回的是指针因为是重载运算符所以才显示指向的内容//find测试cout s1.find(w,2) endl;//pushback测试s1.push_back(6);cout s1 endl;//append测试s1.append(789);cout s1 endl;//rfind测试cout s1.rfind(l , 6) endl;//substr测试cout s1.substr(0, 11) endl;//substr只会截取并返回不改变s1的内容
}在string尾部追加字符时可以使用push_back , append , ,push_back只能追加字符append追加字符串所以我们一般常用的是既可以追加字符又可以追加字符串并且使用起来书写简单代码可读性高
对string进行操作时如果可预见可以放多少字符可以用reserve把空间预留好
这里的 find 和 rfind 与 begin rbegin 那一套一样r都表示相反注意这里find是从pos开始往后找到的第一个指定字符rfind是从pos开始往前找到的第一个指定字符然后返回该字符所在位置的下标
5string类非成员函数
函数名称功能说明operator输入运算符重载operator输出运算符重载getline获取一行字符串relational operators大小比较operator少用传值返回深拷贝效率低
这部分内容比较简单我设置了超链接直接点进去看一下文档就可以了
6其他
string类还有很多其他的操作不一一列举了需要时直接打开cplusplus查找文档即可 string类
7vs和g下string结构说明
前提32位平台
vs下的string结构
string总共占28个字节内部结构稍微复杂一点有一个联合体用来定义string中字符串的存储空间当字符串长度小于16时使用内部固定的字符数组存放当字符串长度大于等于16时从堆上开辟空间这样保证了字符串在较小时不需要通过堆创建提高了效率占16字节
还有一个size_t字段保存字符串长度占4字节一个size_t字段保存从堆上开辟空间总的容量占4字节
最后还有一个指针4字节共28字节
g下string结构
在g下string通过写时拷贝实现只占4个字节内部只包含一个指针指向一块堆空间堆空间内部包含了空间总大小、字符串有效长度、引用计数
写时拷贝在数据第一次写入到某个存储位置时首先将原有内容拷贝出来写到另一位置处然后再将数据写入到存储设备中该技术只拷贝在拷贝初始化开始之后修改过的数据 简单来说就是在用之前不开空间在真正要修改和写入时才开辟空间可以减少空间的浪费它是在浅拷贝的基础上增加了引用计数的方式实现的
引用计数用来记录资源使用者的个数在构造时将资源的计数给成1每增加一个对象使用该资源就给计数增加1当某个对象被销毁时先给该计数减1然后再检查是否需要释放资源如果计数为1说明该对象是该资源的最后一个使用者将该资源释放否则因为其他对象还在使用该资源该资源就不能释放 今日分享就到这里~