string类
string支持流插入和流提取
string初始化
赋值符的重载
遍历string
string的大小:
两个长度没有任何不同
第一种
(写两个函数重载是为了防止字符串为const)
使用引用返回就可以修改得到的变量的值
第二种:迭代器
迭代器iterator
迭代器是一个类似于指针的东西(不一定是指针)
begin返回第一个位置的指针,end返回最后一个字符的下一个位置的指针
遍历方式
迭代器相比于下标访问的优越性
不是所有东西都支持下标访问,但是都支持迭代器
迭代器是一个主流的通用的方法
第三种:范围for
所有结构都支持范围for,因为他的底层就是迭代器
auto后加&可以就可以遍历修改数据了
范围for遍历自动取数据,自动++,自动判断结束
但是,如果类型是const string,就不能用上述遍历修改了
begin存在两种返回数据
反向迭代器
反向迭代器存在rbegin和rend
他的目的是反向遍历
他的++和--是相反的,
++向后走,--向前走
算法:数据排序
参数:起始和结束位置,左闭右开(即传入最后一个的下一个位置)
插入和修改
1.
单个字符
2.
字符串
3.
assign的本质是一种变相的赋值
insert
insert是插入
insert应该慎用,因为效率不高(O(N))
erase
erase是删除
同样慎用,效率不高
如果结束位置较大或不传,则全部删完后停止
但是注意第一个参数pos不能越界
replace
replace的作用是替换
string的部分接口
string的扩容
起初是存在临时数组buf中,buf空间不够,数据会转移到堆中
在vs下的扩容
可以是1.5倍扩容,也可以是两倍扩容
在Linux下的扩容
对于字符串的存储,如果字符串大小小于16
会存储在临时生成的一个数组buf中
如果字符串大于16
就不会存储在buf中,转而存储在堆中
resize和reserve
resize影响size和capacity
reserve只影响capacity
reserve
reserve的作用是扩容
vs下
可以看到申请扩容100,但是实际上扩容了111
linux下
而linux下则是正常的100
同时reserve不仅可以用于扩容,还可以用于缩容
(小于15就会缩,大于等于16,不缩)
但是Linux会缩容
注意,reserve只是扩容(改变capacity),不改变size,导致不能直接用下标访问
resize
resize会改变size
eg.
如果改变后的size大于capacity,则扩容
改变size后会删除多余的字符串
缩容
由于空间不能分段释放,所以缩容的本质是开辟一块更小的空间,然后将数据拷贝
是时间换空间
at
访问pos位置的字符
string operations
c_str
获取指向字符串的指针(首元素的地址)
可以和c语言更好的兼容
find和rfind
find是正着找,rfind是反着找
获取子串
find_first_of
查找aeiou中的任意一个字符
时间复杂度是m*n