string的特性
string类不属于STL,它属于标准库
但由于它具有数据结构的特性,所以从归类的角度,可以将string类归类到容器里面去
在C++标准库中,std::string 是一个特化的类型,实际上是 std::basic_string 的别名。std::basic_string 是一个模板类(std::basic_string
属于C++标准模板库(STL)的一部分),它允许指定字符类型和其他特性(如分配器),而 std::string 则是专门为处理 char 类型字符序列设计的一个具体实例。
所以底层可以认为 string类就是 管理char类型 字符数组的顺序表
(以下图片由cplusplus.com - The C++ Resources Network网站得来)
可以看出不仅有char 字符类型,还有char16_t 等等字符类型,本质上是由于不同编码存在的差异
我们用得最多的是utf-8,它是变长编码,兼容ascll,string就更适用于utf-8
使用string之前,记得要包含<string>头文件
string的构造函数分为7种,赋值重载分为3种
string的构造函数
默认构造函数
-
语法:
string s;
-
作用:创建一个空字符串。
初始化构造函数
-
语法:
string s("hello");
-
作用:使用字符串常量初始化字符串对象。
拷贝构造函数
-
语法:
string s1(s2);
-
作用:使用一个已存在的字符串对象初始化新对象。
指定字符数构造函数
-
语法:
string s(5, 'a');
-
作用:创建一个包含5个字符'a'的字符串。
子字符串构造函数
其中pos是postition的缩写,意思是 从string类型变量 str 的pos位置 开始的len个字符进行构造
len是半缺省参数,使用npos作为默认值
npos是类里的静态成员变量,定义为-1,指得是整型的最大值(也就意味着如果不给第二个参数,默认取到字符串结尾,因为单个字符串很难达到 -1 这么大的长度)
同时,如果给的长度超过了指定字符串的长度,也默认取到字符串结尾
比如下图中的字符串 c,要取20个字符,就只会输出从下标为2位置开始的后面所有字符
拷贝字符串的前n个
-
语法:string s("hello", 2);
注意要与 子字符串构造函数 相互区分
迭代器范围构造函数
-
语法:
string s(s2.begin(), s2.end());
-
作用:使用迭代器范围初始化字符串对象。
string的赋值
分别是string类型的赋值,字符串类型的赋值和字符类型的赋值
string的遍历
1、下标加方括号
分别分为 被const修饰 和没有被const修饰 的方括号操作符
编译器调用时会通过string类型 自动调用最匹配的
2、迭代器
使用string的内置迭代器,也可以进行string的遍历
由于迭代器一般会使用类的形式进行实现,相当于在类里面再定义一个类(嵌套类),所以在外部进行访问迭代器时,需要使用类作用限定符指定所在类(string类的迭代器就在string类)
begin函数 返回的是指向开始位置的迭代器,end是结束位置(有效字符 不包括‘\0’)的下一个位置的迭代器(左闭右开)
由于每个容器底下都有个迭代器类型,因此可以实现与底层结构的解耦,以及与算法的解耦
insert头插
有七种,这里只介绍其中三种
意思就是在pos位置前插入 s 字符串
可以看到字符串“hello”成功的插入到了下标为0的位置 ‘w‘ 前面
接下来就是单个字符插入
分为两种形式
第一种形式没有使用迭代器,意思为,在pos位置前 插入 n个 c字符(这个n在实际使用的时候 很容易忘记,需要注意一下)
第二种与第一种类似,只是pos变成了迭代器形式
第三种:迭代器形式的头插 字符还有一种形式
意思就是在p的位置前插入一个字符 c,不用额外说明字符个数