目录
编辑
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<iostream>
#include<string>
using 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() //11
s.length() //11
s.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)//h
s[0]//h
s.back();// d
s.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还是要学看官方文档,此文只是为有个大体的印象。