1.string类的优势及重要性(部分)
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。
2. 标准库中的string类
2.1 string类(了解)
附文档链接:
SLT-string类
- 字符串是表示字符序列的类, string是表示字符串的字符串类
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性,该类的接口与常规容器的接口基本相同,添加了一些专门用来操作string的常规操作。
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作basic_string的默认参数,string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
- (1)注意:这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。不能操作多字节或者变长字符的序列。
(2)在使用string类时,必须包含#include头文件以及using namespace std;(也可以单独展开命名空间域std:string)
2.string的常用接口介绍
(1)构造函数string类对象的常见构造
代码示例
#include<iostream>
#include<string>
using namespace std;
int main()
{
//1.默认构造
string s1;
//2.带参构造
string s2("hello world");
//3.拷贝构造
string s3 = s2;
//4.隐式类型转换
string s4 = "hello world";
//5.字符
string s5(5,'x');
}
运行结果
!
(2) string类对象的容量操作
- size使用示例
size和length的作用是一样的,只是为了适配其他容器,一般使用size
//下标+[]
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i] << " ";
}
cout << endl;
- empty使用注意
这个程序,会引发越界访问和无限循环,这是因为只要s1一开始不为空且在后续循环中不被修改为空,也没有越界检查,循环就会一直进行下去。
修改:(说明:遍历字符串并不需要这么麻烦,这是为了提醒使用empty越界的错误演示)
void test03()
{
string s1("hello world");
for(int i=0;!s1.empty();i++)
{
if (i == s1.size())
{
break;
}
cout << s1[i] ;
}
}
- clear使用示例
说明:将s1中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
reserve使用
说明:reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大
如果能提前确定所需空间大小,利用reserve提高插入数据的效率,避免增容带来的开销
resize使用示例
void test03()
{
string s("hi");
// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
// “aaaaaaaaaa”
s.resize(10, 'a');
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
// "aaaaaaaaaa\0\0\0\0\0"
// 注意此时s中有效字符个数已经增加到15个
s.resize(15);
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
// 将s中有效字符个数缩小到5个
s.resize(5);
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
}
(3)string类对象的修改操作