STL基本内容
string是什么
string实质上是一个对象
string可看作一个串,类似字符数组
可以扩容,可以增删查改
可用下表访问操作符[]引用,修改某值
构造函数
默认构造
拷贝构造:参数为(string 或 char*)
求string对象的长度不能strlen
应该size()/length()
两者作用完全相同
不过一般统一用size(与其他操作同名)
size大小不算上最后的\0
iterator
iterator实质可理解为类中的对象
运用是可理解为指针一样东西
迭代器为主流,通用方式,所有容器都可以用iterator遍历(甚至list,set也可以)
定义与使用
begin 开始位置迭代器
end 结束位置的下一位置迭代器
对应迭代器对象iterator
rbegin
rend 倒着遍历
此时++的逻辑与平常相反
迭代器对象为:reverse_iterator
对iterator的*可以理解为解引用,但实际是操作符重载
typeid()打印变量类型
一种很方便的遍历
所有容器都可以范围for
底层迭代器实现
for中元素被修改不会影响实参(iterator会),for实质为赋值传参
const iterator
iterator 可读可写
const_iterator 指向内容不能修改(本身可以修改)
迭代器有四种类型
const 和 reverse 相互搭配(const在前,单词间下划线链接)
sort对迭代器使用
sort直接改变原有数据: sort
实现会直接修改传入的数据序列,使其按照一定的顺序排列。这意味着原始数据会被重新排序
注意参数表示的区间左闭右开
append
append 函数通常不接受单个字符作为参数,如想尾插单个字符,最好用push_back()
总的来说,append不如+=方便
push_back()
push_back 和 pop_back 参数都只能一个字符
assign
assign属于赋值行为
insert
insert时间复杂度O(n),效率不高
insert(int pos, char* str)
注意:insert插入单个字符,要指定字符个数为1
erase
erase效率不高,和insert一样
erase(int pos=0,size=n)
传入的size可非法(过大),不会报错,有多少取多少
replace
只记一个即可
replace (int pos, int len, string str)
将原有的pos开始(包含),后的len个删了,换为str(两者大小不必相等)
capacity
capacity指的是可自由容纳的量,不带\0
capacity比实际空间少一个,那一个是\0,
g++中\0不会算入capacity
reserve
reserve用来改变capacity
用于在已知所需空间时,提前开辟空间
可能会改的比指定值大
reserve可能不会缩容
resize
resize影响size
resize(int count, char ch)
ch默认\0
只会把新增的空间赋值为ch,不变原有空间的数据
tips:
空间不能分区释放
缩容其实是另辟空间
c_str
会返回字符串首地址
find
find(string str, pos=0)
find(string ch, pos=0)
rfind 寻找顺序相反
substr
string substr(pos, len)
从pos截取len长度
npos可理解为无限大,是GB级别的空间