目录
一、为什么会有string?
二、string的常见接口说明
2.1 string的默认成员函数
2.1.1 默认构造函数
2.1.2析构函数
2.1.3赋值运算符
2.2迭代器介绍
2.2.1 正向迭代器
2.2.2 反向迭代器
2.3 string类对象的容量操作
2.4 string类对象的访问及遍历操作
2.4.1 operate[ ]
2.4.2 begin + end
2.4.3 rbegin + rend
2.4.4 范围for循环
2.5 string类对象的修改操作
2.6 string类对象的其他接口
一、为什么会有string?
在C语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在这种情况下,C++引入了string类来满足OOP。
二、string的常见接口说明
本篇博客以string - C++ Reference为纲领对string类进行说明。
2.1 string的默认成员函数
2.1.1 默认构造函数
常用的构造函数如下:
上述第一个是实例化一个空的字符串,里面中有0个字符;
第二个是用另一个字符串拷贝构造新的字符串;
第三个是用使用s来构造新的字符串。
不常用但需要了解的函数如下:
在讲解第三个函数之前,需要了解一下 npos,查阅文档可知:
static const size_t npos = -1;//无符号整型的-1,即最大值
好,现在可以解释上述的函数了:
上述第一个函数表示用 str中从pos开始的npos个字符 来构造string,当没有传递npos时,就默认到达末尾的位置(当npos的值大于str长度时也是拷贝到末尾);
第二个函数表示拷贝s的前n个字符来构造string;
第三个函数表示用n个c字符来构造string;
第四个就交由读者自行了解。
2.1.2析构函数
一般来说析构函数不需要实现,了解即可。
2.1.3赋值运算符
赋值运算符如下:
上面的函数表明了可以使用 str,s,c来为string赋值。了解之后,直接拿来使用即可
2.2迭代器介绍
常用的迭代器如下:
2.2.1 正向迭代器
begin返回的是任意容器的第一个数据的iterator,end返回的是任意容器的最后一个数据的itrator。可以顺序遍历string。
而这两个函数都有两个函数声明:iterator 可读可写;const_iterator 只可读,保证元素不能被修改。
2.2.2 反向迭代器
rbegin返回的是任意容器的最后一个数据的iterator,rend返回的是任意容器的第一个数据的前一个位置的itrator。对string进行逆序遍历。
这两个函数也有两个函数声明:原则同上。
2.3 string类对象的容量操作
最常见的操作如下:
对于size和length两个函数均是用来返回字符串长度的,size是为了与STL相符而优化来的;
resize是用来将有效字符的个数该成n个,多出的空间用字符c填充(省略不写的话,默认补'\0'),若减少的话,则表示删除;
capacity返回字符串的当前空间总大小;
reserve表示为当前字符串预留n个字符的空间;
clear用来清空有效字符;
empty用来判断当前是否为空串,是返回true,否则返回false。
此函数是用来使容量和大小相适应的,但不建议使用,因为释放内存空间时不能分段释放,因此这个函数会优先申请一块合适的空间来存放数据,但是时间消耗较大。
2.4 string类对象的访问及遍历操作
对于string的遍历有4种方式,接下来将一一介绍:
2.4.1 operate[ ]
字符串实质上也是对字符数组的封装,因此也可重载[ ]来支持字符串的遍历。
2.4.2 begin + end
这两个迭代器实现了string类对象的正向遍历。
2.4.3 rbegin + rend
这两个迭代器实现了string类对象的反向遍历。
2.4.4 范围for循环
范围for是C++11引入的操作,他大大的方便了我们对数组等的遍历。
具体的代码实现:
void Teststring()
{
string s("hello Bit");
// 3种遍历方式:
// 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符,
// 另外以下三种方式对于string而言,第一种使用最多
// 1. for+operator[]
for (size_t i = 0; i < s.size(); ++i)
cout << s[i] << endl;
// 2.迭代器
string::iterator it = s.begin();
while (it != s.end())
{
cout << *it << endl;
++it;
}
// string::reverse_iterator rit = s.rbegin();
// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
auto rit = s.rbegin();
while (rit != s.rend())
cout << *rit << endl;
// 3.范围for
for (auto ch : s)
cout << ch << endl;
}
2.5 string类对象的修改操作
对类对象的插入操作:
但最常用的是+=运算符,剩下的两个稍微了解就好。
若是对首元素或者中间元素的插入和删除操作,时间复杂度为O(N),时间消耗很大,不是特别建议使用,了解常用接口即可。
2.6 string类对象的其他接口
查看了解使用即可。
该函数用来截取从pos位置开始的数据,默认到结束位置为止。
该函数用来将C++的字符串转化为C语言的字符数组。