C++ string

类string重新自定义了字符串。标准库 string 表示可变长的字符序列。

头文件

#include<string>

定义和初始化 string 对象

初始化 string 对象的方式

  1. string 对象;// 默认初始化,该对象是一个空字符串
  2. string 对象1 = 对象2;// 对象1的内容与对象2的内容相同
  3. string 对象 = 字符串字面量;// 该对象的内容是此字符串字面量【该字面值中除了最后的空字符外其他所有的字符均被拷贝到新建的 string 对象中去】 拷贝初始化
  4. string 对象(字符串字面量);// 该对象的内容是此字符串字面量 直接初始化
  5. string 对象(数字 n ,字符 c);// 该对象的内容是 n 个字符 c 直接初始化

直接初始化与拷贝初始化

使用等号(=)初始化一个变量,实际执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中。不使用等号,执行的是直接初始化。

初始值只有一个时,使用直接初始化和拷贝初始化都行,初始化要用到的值有多个时,一般使用直接初始化。非要使用拷贝初始化的方式处理也可以,但需显示地创建一个(临时)对象用于拷贝。

string 对象 = string(数字 n ,字符 c); 拷贝初始化

该对象的初始值是string(数字 n ,字符 c);,是一个 string 对象,然后这个 string 对象又拷贝给了前面声明的对象,等价于:

string temp(数字 n ,字符 c);

string 对象 = temp;

操作

  • string直接支持字符串连接
  • string直接支持字符串的大小比较
  • string直接支持子串查找和提取
  • string直接支持字符串的插入和替换
  • string同时具备字符串数组的灵活性,可以通过[ ]重载操作符来访问每个字符。

读写 string 对象

可使用 IO 操作符读写 string 对象,string 对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一个空白符为止。多个输入和多个输出可连写在一起【因为返回运算符左侧的运算对象作为结果】。

读取未知数量的 string 对象

int main(){
   string word;
   while(cin>>word)//在读取时检测流的情况,如果流有效【没有遇到文件结束标记或非法输入】,执行while语句内部的操作
       ...;
   return 0;
}

getline() 读取一整行

使用 getline() 保留输入时的空白符,参数是一个输入流和一个 string 对象,函数从给定的输入流中读入内容,直到遇到换行符为止(换行符也被读入),将所读的内容存到 string 对象中(不存换行符)。只要遇到换行符就结束读取操作并返回结果,一开始输入换行符也是如此【得到的结果是空 string】。返回流参数,可使用 getline 的结果作为条件。

int main(){
   string line;
   while(getline(cin,line))//line中不包含换行符
       ...;
   return 0;
}

empty()

根据 string 对象是否为空返回对应布尔值。

string.empty()

size() 长度

返回 string 对象的长度,即 string 对象中字符的个数。

string.size()

返回值

返回 string::size_type 类型的值。

string 类及其他大多数标准库类型均定义了几种配套的类型,体现出标准库类型与机器无关的特性。使用时通过作用域操作符表明名字 size_type 是在类 string 中定义的。

是无符号类型的值,能足够存放下任何 string 对象的大小,所有存放 string 类的 size 函数返回值的变量都是 string::size_type 类型。

auto len = line.size();//len 的类型是 string::size_type

比较 string 对象

逐一比较 string 对象中的字符,且对大小写敏感。

相等运算符 ==/!=

==和!=分别检验两个 string 对象相等或不相等,相等意味着长度相同而且所包含的字符也相同。

关系运算符

<、<=、>、>= 分别检验一个 string 对象是否小于、小于等于、大于、大于等于另一个 string 对象。

依照大小写敏感的字典顺序比较:

  • 如果两个 string 对象的长度不同,而且较短 string 对象的每个字符都与较长 string 对象对应位置上的字符相同,则说明较短 string 对象小于较长 string 对象。
  • 如果两个 string 对象在某些对应的位置不一样,则 string 对象比较的结果其实是 string 对象中第一个相异字符比较的结果。

赋值

允许把一个对象赋值给另外一个对象。

相加

两个 string 对象相加

两个 string 对象相加得到一个新的 string 对象,其内容是把左侧的运算对象与右侧的运算对象串接而成【前半部分是加号左侧的运算对象所含的字符,后半部分是加号右侧所含的字符】。+= 将右侧 string 对象的内容追加到左侧的 string 对象的后面。

字面值和 string 对象相加

字符字面值和字符串字面值转换成 string 对象,在需要 string 对象的地方可以用字符字面值和字符串字面值代替。把 string 对象和字符字面值/字符串字面值混在一条语句中时,必须确保每个加号运算符(+)的两侧的运算对象至少有一个是 string 对象。

string s1 = (s2 + 字面值1) + 字面值2;//s2+字面值得到一个 string 对象

等价于:

string tmp = s2 + 字面值1;

s1 = tmp + 字面值2;

字符串字面值与 string 是不同的类型。

处理 string 对象中的字符

遍历所有字符

for(declaration : expression)

statement;

expression 是一个对象,表示一个序列。declaration 定义一个变量,用于访问序列中的基础元素。每次迭代,declaration 的变量会被初始化为 expression 的下一个元素值。

一个 string 对象表示一个字符的序列,string 对象可以作为范围 for 语句中的 expression 部分。

使用范围 for 语句改变字符串中的字符

把循环变量定义成引用类型可以改变 string 对象中字符的值。引用只是给定对象的一个别名,使用引用作为循环控制变量时,该变量实际上被依次绑定到序列的每个元素上,使用该引用,可改变其绑定的字符。

访问部分字符

访问 string 对象中的单个字符的方法:一是使用下标,二是使用迭代器。

下标运算符 []

接收的参数是 string::size_type 类型的值,表示要访问的字符的位置。返回该位置上字符的引用。下标从0计起,下标必须>=0且<s.size()。

任何一个表达式的值只要一个整型值就可作为索引,如果某个索引是带符号类型的值,将会自动转换成由 string::size_type 表达的无符号类型。

在访问指定字符之前,首先检查 s 是否为空。只要对 string 对象使用下标,需确认在那个位置上确实有值。如果 s 为空,则 s[0] 的结果是未定义的。

只要字符串不是常量,就能为下标运算符返回的字符赋新值。

使用下标执行迭代

for(decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)

使用下标执行随机访问

构造函数

成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何hyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值