STL标准库之string
string类的简介
在c语言中,对于字符有char类型,对于字符串就没有内置类型了,字符串是给起始位置的指针,结尾以’\0’,这样做是有缺陷的,容易越界访问。
而在工作和刷题中,经常会看到以string作为字符串的类型,这种类型是c++标准库定义的一种专门管理字符串这种类型的。
总结来看:
1.字符串是表示字符序列的类。
2.并且c++标准库提供了丰富的接口,用于操作字符串,这样比我们自己用c库操作方便多了。
3.本质上讲,string是一个类,basic_string是它的类模板,string是这个类模板的一个实例,用的是char来实例化这个类模板。
常用的string类的接口
为了方便记忆,我们将常用的接口分为以下几类:
构造、容量、访问及遍历、修改、特殊非成员函数(友元函数实现的)
构造
函数名称 | 功能 |
---|---|
string() | 构造空字符串 |
string(const char* s) | 用c格式字符串构造string |
string(size_t n, char c) | string类对象中包含n个c的字符 |
string(const string& s) | 拷贝构造 |
对应写法
void test()
{
string s1;
string s2("1,2,3");
string s3(10, 'a');
string s4(s3);
}
需要注意的是:这里的构造函数,拷贝构造函数,都是深拷贝,也就是说,并不是编译器自动补充的,不是直接拷贝原来对象中的值,而是将对象中涉及到资源管理的地方,通过创建新的空间,实现了资源本身的拷贝
容量
函数名称 | 功能 |
---|---|
size | 返回字符串有效个数 |
length | 返回字符串有效个数 |
capacity | 返回总空间大小 |
empty | 检测是否为空字符串,为空返回true,不空返回false |
clear | 将字符串清空 |
reserve | 为字符串开辟空间,可以开辟大于原来的空间,但是无法减小 |
resize | 将有效字符个数修改为n个,多出的字符用字符c填充 |
注意:当使用clear时,只是将有效字符个数清空为0,并不会在底层修改容量大小。
而reserve只会增大容量,不会减小容量
而resize可以增加有效元素个数,也可以减小有效元素个数。当大于容量后,也会扩大容量,而且在vs编译器中是1.5倍的方式扩容,而linux下的g++是以2倍方式扩容的。
当resize小于等于15时,会将字符串放入string内部的字符数组中,capacity大小就变成15了。
访问及遍历
函数名称 | 功能 |
---|---|
operator[] | 返回pos的位置,通过下标随机访问 |
begin+end | begin获取第一个位置的字符的迭代器,end获取最后一个位置下一个位置的迭代器 |
rbegin+rend | rbegin获取最后一个位置下一个位置的迭代器,rend获取第一个位置的字符的迭代器 |
范围for | c++11支持的通过范围for遍历字符串 |
注意有下列几种遍历字符串的方式:
//遍历字符串的方式
for(auto e : s1)
{
cout << e << " ";
}
cout << endl;
for(size_t i = 0; i < s1.size(); ++i)
{
cout << s1[i] << " ";
}
cout << endl;
string::iteritor it = s1.begin();
auto it = s1,begin();
while(it != s1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
string::iteritor rit = s1.rbegin();
auto rit = s1.rbegin();
while(rit != s1.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
修改
函数名称 | 功能 |
---|---|
push_back | 在字符串后,尾插字符c |
append | 在字符串后,拼接一个字符串 |
operator+= | 在字符串后,追加一个字符串 |
c_str | 返回c格式的字符串 |
find+npos | 从pos位置开始向后找,返回找到的字符的位置 |
rfind | 从pos位置从后向前找,返回找到的字符的位置 |
substr | 在字符串的pos位置开始,截取n个字符,返回一个string类型的子字符串 |
注意:字符串查找的过程,需要搭配npos来使用,当没有找到时,find会返回npos(预先定义好的一个极大值,表示字符串的最终位置)
size_t start = 0, end = 0;
string s1("i like cpp");
while(end < s1.size())
{
end = s1.find(" ", start);
if(end == string::npos)
{
end = s1.size();
}
string tmp = s1.substr(start, end-start);
start = end + 1;
}
特殊非成员函数
函数名称 | 功能 |
---|---|
operator+ | 字符串拼接,不改变原字符串,传值返回,效率较低 |
getline | 获取一行,之前使用cin时,会从空格处分开 |