string类:一种动态类型的顺序表—存储字符类型的元素,在一段连续的空间中
string类中的接口分为以下几个模块
构造与析构
string();
string(const char*);
string(size_t n, char ch);
string(const string& s);
遍历操作
for()+下标
范围for
采用迭代器
begin()
end()
容量相关
size()
capacity()
empty()
resize(size_t n, char ch);
reserve(size_t n);
元素访问相关
operator[] (index)
at(index)
修改
operator+=(ch/const char*/string)/push_back(ch)/insert/erase
特殊操作
c_str()
find(ch, pos=0)
string::npos(静态成员变量)/rfind(ch/const char*/string, pos)
substr(pos, n)
…
将string类型对象中有效元素个数调整到newsize个
void resize(size_t newsize, char c);
void resize(size_t newsize);
1.将有效元素个数缩小,注意:仅仅是将有效元素个数缩小到newsize个,并不会改变底层容量的大小
newsize <= oldsize
2.将有效元素个数增多:假设原来有效元素个数为oldsize,原来的容量为oldcapacity
newsize > oldsize
newsize <= oldcapacity 直接在源字符串尾部追加newsize-oldsize个C即可
newsize > oldcapacity 扩容,扩容方式与顺序表的扩容方式一致(开辟新空间,拷贝元素,释放旧空间)
扩容:将底层空间容量修改到newcapacity
void reserve(size_t newcapacity)
注意:在扩容期间不会修改有效元素个数
假设:当前容量为oldcapacity
1.newcapacity <= oldcapacity说明需要底层容量缩小
newcapacity > 15 reserve直接忽略
newcapacity <= 15 reserve才会将容量缩小到15个
2.newcapacity > oldcapacity 说明需要底层容量扩增newcapacity个
VS中当用户在构造string类型的对象时,如果有效字符个数小于等于15个时,利用自己内部静态的数组,如果超过15个,则动态开辟空间
1.size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
2.clear()只是将string中的有效字符清空,不改变底层空间大小。
用push_back()验证string类的扩容机制:
vs----------------P.J.STL-----------1.5倍
linux-------------SGI-----------------2倍
迭代器失效
1.所有可能会引起容量修改的操作
push_back
insert
operator+=()
append()
resize()
reserve()
2.其他方式
erase()
clear()
swap()
…
解决:在使用之前重新给迭代器赋值