目录

​编辑

Constructor/Destructor/Operator=

Constructor:构造函数

Iterator:迭代器

begin()/end():迭代器像指针一样访问问函数

个人对迭代器的理解

rbegin()/rend():迭代器反向移动

除了用迭代器访问元素外string类还可以[]+下标

Capacity:容量?

s.size()/s.length:求字符串

s.reserve()非强制指令修改容量大小

s.resize(n,ch)修改字符串内容到n个长度,用ch字符填补新增的长度

Element access:获取元素

Modifiers:修改

+=:添加字符或字符串到原来的字符

assign是覆盖字符串和replace大同小异

insert:选择地方插入字符串

erase:消除指定位置字符串

String operations

find寻找字符串的对于字符或者字符串返回第一个位置,如果没找到返回npos常数

rfind:从后往前找,和find的方向相反。

find_first_of:找出字符串的所有指定字符

Member constans:常数

Non-member function overloads:非成员函数

getline:读取有空格的字符串

Constructor/Destructor/Operator=

Constructor:构造函数

#include#includeusing namespace std;int main(){string s1;//空字符串string s4("abcde");//"abcde"string s5("abcde",3);//"abc" 截取前n个string s2(s1);//空字符串 //拷贝构造string s3(s4, 0, 2);//'ab' //截取s4的[0,2),不包括2string s6(6, 'a');//'aaaaaa'return 0;}

Iterator:迭代器

begin()/end():迭代器像指针一样访问问函数

string::iterator it = s1.begin();while (it != s1.end()){cout << *it <<" ";++it;}

有点懵对吗?先看看第一句代码

string::iterator it=s1.begin();//定义了变量it,调用s1的实例方法begin的返回值赋值给it//it的类型是 string::iterator表明it的类型是string的迭代器

所有s1.begin()和s1.end()表示什么意思?

图解

s1.begin()可以看成第一个元素的地址,s1.end()可以看成最后一个有效元素(‘o’)的下个元素的地址(‘/0’);

由此我们明白了代码的意思,从第一个的元素开始访问,一直到’/0’停止。

观察代码我们发现迭代器的用法和地址很像,上面也说了可以看成指针,所有迭代器是指针吗?

迭代器不完全是指针

某些类的迭代器底层是指针,如string,但是有些类的迭代器底层并不是指针,但在理解上可以看成指针。

个人对迭代器的理解

在C时我们用数据类型(int ,char等)去描述一个对象,但是这是一种机器的角度去看待事物,随着发展,人们提出用类和对象去描述一个对象,如果类对标的是数据类型,那么迭代器对标的就是指针,所以迭代器是类指针(如果真的有这个名字,笑),准确说是stl的类

rbegin()/rend():迭代器反向移动

string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";++rit;}
dlorw olleh

图解

除了用迭代器访问元素外string类还可以[]+下标

string s1="hello";
s1[0]//'h's1[1]//'e's1[2]//'l'

两种方式的比较

两种访问方式的比较

[]+下标比较简洁,但是只能在链状结构上使用,比如数组,string(如果是树的话,就不能用这种方式了。)

迭代器可以用于所有的容器(就是数据结构,如树,图等等),迭代器可以和算法配合。

Capacity:容量?

有点懵?我们可以把类的成员变量简化为右边三个

_s 表示字符串, _size表示字符串大小, _capacity表示空间的容量,如果字符串大于空间大小就系统就会扩容。

s.size()/s.length:求字符串

string s("hello world");//s.size()/s.length()返回字符串长度不包括'\0's.size() //11s.length() //11s.max_size()//字符串的最大长度s.capacity()//字符串开辟的空间s.clear()//清空字符串内容

s.max_size()并没有太大意义,不同版本的编译下值不同,不同编译器的s.capacity()变化方式也不同

s.reserve()非强制指令修改容量大小

s.resever(100)//capacity:15->100 or greater

不一定等于100是因为编译器的对齐原则可能大于100

非强制体现在字符串非空时不会缩小空间,clear()后就会

s.reserve(1)//capacity:15->15,非空字符串s.clear()s.reserve(1)//capacity:15->1

s.resize(n,ch)修改字符串内容到n个长度,用ch字符填补新增的长度

string s("hello world");s.resize(s.size()+1,'!');// hello word!

*n是长度,不是空间,不算’/0’,如果n小于s.size()就会只取前n个字符。

s.shrink_to_fit()是收缩空间。

Element access:获取元素

operator[]上文已经提到了,s.at()用法和operator[]一样

s.at(0)//hs[0]//hs.back();// ds.front();// h

*s.back()是字符串的长度的最后一个,不算’\0′

Modifiers:修改

+=:添加字符或字符串到原来的字符

string s("hello world");s+='!';//"hello world!"

+=和append,push_back大同小异,append稍微特殊的用法可以截取一段字符的一部分添加

string s1("bye");s.append(s1,0,1);//"hello worldb"

注意截取的片段是[0,1)的关系。

assign是覆盖字符串和replace大同小异

string s("hello world");string s1("bye");s.assign(s1, 0, 1);//s:b

insert:选择地方插入字符串

string s("hello world");string s1("bye");s.insert(0,s1);cout << s << endl;//byehello world

在0的位置的插入字符串

erase:消除指定位置字符串

string s("hello world")s.erase(0,1);cout << s << endl;//ello world

String operations

find寻找字符串的对于字符或者字符串返回第一个位置,如果没找到返回npos常数

string s("hello world");cout << s.find('h') << endl;// 0

rfind:从后往前找,和find的方向相反。

find_first_of:找出字符串的所有指定字符

string s("hello world");cout << s.find_first_of("helo") << endl;//0 第一个字符h就在"helo"

寻找在字符串”helo”的任何一个字符,并返回位置

find_last_of:从后向前找

Member constans:常数

string s("hello world");size_t a = -1;s.npos == a //true

s.npos表示size_t的最大值,常常会出现在返回值或者参数时,如find没找到字符串会返回npos和a的值是相同的。

Non-member function overloads:非成员函数

operator+/operator>>/operator<<在前面的章节函数重载时提过,因为顺序的原因所以一个是不能重载的。

getline:读取有空格的字符串

string s;string s1;cin>>s1;//"h d"getline(cin, s);//"h d"cout << s;//"h d"cout << s1;//'h'

cin不能读取空格,getline可以

最后:学STL还是要学看官方文档,此文只是为有个大体的印象。