🍓标准库类型string
2022-5-1
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

 
string表示可变长度的字符串。string类型包含在 <string> 头文件中。
之所以抛弃char*的字符串而选用C++标准库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,它集成的操作函数足以完成大多数情况下的需要。
 

定义和初始化string对象

如何初始化类的对象是类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量不同, 或者是初始值的类型不同。
类类型会调用类自己的构造函数进行初始化,一个类会定义多个构造函数来执行初始化。
 
以下是最基本的string的构造函数:
notion image
直接初始化和拷贝初始化
使用等号=初始化一个变量,执行的是拷贝初始化(copy initialization),编译器把等号右侧的初始值拷贝到新创建的对象中去;不使用等号,执行的是直接初始化( direct initialization)
 
当只有一个初始值时,使用直接初始化和拷贝初始化的效果是一样的。当有多个参数时,只能使用直接初始化,或者用 string s8 = string(10, 'c'); 的形式先创建一个临时对象再执行拷贝初始化,这里同样是直接将临时对象替换过去的,因为临时对象在声明语句后消失,因而可以安全替换。
 

string 可执行的操作

类除了定义了如何创建和初始化之外还定义了可以执行哪些操作。C++ 中的类既可以定义按名字调用的成员函数,也可以对操作符进行重载,事实上在 C++ 中操作符是一种特殊的函数。以下是常用的几个 string 类方法:
notion image

读写string对象

在执行读取操作时,string对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读取,直到遇见下一处空白为止。
 
当希望能在输出的字符串中保留输入的空白字符时,可以使用getline函数,getline 函数可以读取一整行字符。该函数只要遇到换行符就结束读取并返回结果(换行符也被读进来了),然后把所读内容存入到 string 对象中(不保存换行符)。如果输入的开始就是一个换行符,则得到空 string
 

empty和size

empty函数根据 string对象是有为空返问一个对应的布尔值
 
size函数返回 string对象的长度,返回的类型是 string::size_type 而不是 int,此类型定义在 string 内部作为其补充类型,补充类型使得标准库在不同机器上可以进行不同的实现,从而满足可移植的目的。
string::size_type 被定义为一种无符号类型并且足够长用以容纳任何字符串的长度。在C++中应该尽可能使用此类型,为了避免繁杂的拼写,可以用autodecltype 关键字。
注:不要将string::size_type 与int混用,因为负数会被转化为非常大的无符号值。
 

比较string 对象

相等性运算符(==!=)分别检验两个string对象相等或不相等,string对象相等意味着它们的长度相同而且所包含的字符也全都相同。关系运算符<、<=、>、>=分别检验一个string对象是否小于、小于等于、大于、大于等于另外一个string对象。上述这些运算符都依照(大小写敏感的)字典顺序:
  • 如果两个string对象的长度不同,且短string对象的每个字符都与长string对象对应位置上的字符相同,就说短string小于长 string\0小于任何字符)
  • 如果两个string对象在某些对应的位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果
 

字面量与 string 字符串相加

注意在 + 操作符重载中,函数定义希望接收的参数是 string 类型,但是可以传递字符串字面量。
 
C++ 需要一种类型,而另外一种类型可以转换为此类型时,可以将那一种类型的值传入。string 类允许将字符字面量和字符串字面量转为string对象。因而可以混用 string 和字面量于 + 操作符重载函数中。但是不能完全使用字面量,原因在于完全使用字面量将会调用字符数组的加法运算,而数组不支持此运算,将无法通过编译。
string 类的这种转换事实上是由对应接收单个参数的构造函数定义的,C++ 会隐式调用此构造函数来执行转换。
由于C++必须兼容C,字符串字面量并不是string类型,而是以空字符 \0 结尾的字符数组。但进行混用时应当有所理解。
 
 

处理 string 中的字符

cctype头文件中定义与字符相关的函数:
notion image
C++除了使用其自己定义的标准库外,还会使用C的标准库。C++版本的C标准库头文件名字被替换为c开头,然后去掉.h后缀,如:ctype.hC++中为 cctype 。这样做的好处在于新的头文件中所有函数都在std名称空间中。
 
为了处理string中的字符有三种方法:范围 for(range for)语句、迭代器以及下标运算符。
 
范围 for(range for)语句
范围for语句是C++11标准中引入的,形如:
其中 declaration 跟普通的声明一样,可以使用auto或者decltype
 
如果希望改变 expression 所表示对象中值或者避免拷贝,将声明中的变量指定为引用。范围 for 会顺序遍历中的 expression 中的元素,并将值拷贝到控制变量中。
 
下标运算符
下标运算 [] 返回的是元素的引用,C++ 中的所有下标都是从 0 开始。如果下标超出了范围得到的结果是未定义的,因而对空字符串进行下标操作是未定义的。这种数组越界的错误在 C++ 中是不检查的,程序员必须自己保证下标不会越界。注意: string 的下标操作要求索引必须是 string::size_type 类型的,所以并不支持负数的索引,这与数组的索引允许负数是不一致的。string 的下标运算允许随机访问。
C++标准并不要求标准库检测下标是否合法。编程时可以把下标的类型定义为相应的 size_type,这是一种无符号数,可以确保下标不会小于0,此时代码只需要保证下标小于 size 的值就可以了。
 
  • C++
  • decltype类型指示符标准库类型vector
    目录