string 1

string 1
string 不是STL而是容器string实现遍历的方法1。下标[ ] 之所以适用是应为底层是数组。当是树链表时用第二种迭代器方式s2.size()是 C std::string 类最核心的成员函数之一用于获取字符串的实际字符长度2.迭代器 iterator初步了解可以修改目标空间内数据任何容器的迭代器属于 左边使用它的容器类域如下图使用迭代器之前要说明位置it就呼之欲出it是对象可以看作是一个指针一样的东西用法跟指针类似可能是指针又可能不是指针底层具体实现不同编译器有不同方式it* 暂时理解为对指针解引用或者为*的重载it 暂时理解为对指针解引用的自增或者的重载begin()是返回目标空间开始位置的迭代器end()是返回目标空间最后一个有效字符下一个位置的迭代器3.范围for 不能修改目标空间内数据ch : s2 表示将对象内每一个字符都挨个赋给变量chauto表示自动推导的意思auto ch : s2 表示将对象内每一个字符都挨个赋给变量chauto自动推导出每个元素类型当然auto不写在auto位置手动写元素对应的类型也行这里写成char也行然后挨个打印ch,但目标空间内数据本身不变这样写才能修改目标空间内数据写成ch的引用意思是ch是目标空间中每个数据的别名2.3底层是一样的typeid().name()可以用来打印数据类型用法如下红框。auto 参数不能单独使用必须给初始值auto不能定义数组这里用的python当对象较大时auto用intx10;autoy x;auto无*时 右边可以是指针auto*z x; auto有*时 右边必须是指针范围用于容器和数组反向迭代器普通对象用普通迭代器const对象用const迭代器const迭代器指向的内容只能读不能修改但cit(指针)本身可以修改,比如cit所以迭代器有四种length是之前的旧的返回字符串有效字符长度概念具有局限性对有些数据结构不适用size是新的返回字符串有效字符长度概念具有广泛性以后用它就行capacity 容量 是指可以存多少有效字符有效空间不算\0以后打印capcity时只显示有效元素个数。存字符串时会将\0存入。容量会比实际开辟的空间小一个这里探讨一下开辟空间的规律vs工程师怕string类对象开小块空间都开到堆上在类内默认有一个_Buff[ 16 ]数组 ,_buff[16]是string类的非静态成员数组它的存储空间嵌入在string类对象内部对象在哪他就在哪。若要存的数据16字节_Buff够用时直接用此数组16字节时不用_Buff数组,存在char* _str 指针指向的堆的空间上存。所以这是上图15 31的原因。所以一旦要往堆上存时从一块空间转移往另外一块空间上开辟空间时capcity就先按2倍扩后续按1.5倍扩如果没有从一块空间转移往另外一块空间上开辟空间时按1.5倍阔。注意capacity 扩容在不同编译器下实现不同这里比较一下对象s2 s3的大小根据内存对齐规则两者大小一样vs编译器g编译器8字节反复进行扩容会有消耗提前开辟一块有效空间就会好一点有关键字 对象.reserve(n)n是字节数以下为vs平台reserve扩容时会整数倍对齐所以开辟的有效空间比要求的大这里是111。实际开辟空间更大是n的至少112以下是linux下g实现刚好reser开辟的有效空间就是100实际开辟空间更大是n的至少101平时我们谈论string容量时默认不包含\0我们探讨 对象.reserve(n)中n是否会影响size capcity以下是vs实现 s2为24字节。(16)按1.5扩有效空间为31nsizecapcity时size不变capcity不变当sizencapcity时size不变capcity不变当ncapcity时size不变capcity扩容以下是linux下g实现s2为24字节会按2倍扩有效空间为48当sizencapcity时size不变capcity不变当nsizecapcity时size不变capcity缩容至size大小当sizencapcity时size不变capcity恢复至原来大小当ncapcity时size不变capcity扩容不清容量不算\0缩容想节省空间时越界会断言与上图功能一样只不过越界会抛异常后续练习没看