C++ Primer:3.2 标准库类型string

其他章节:C++ Primer 学习心得

标准库类型string表示可变长的字符序列,使用string类型必须首先头文件,string定义在命名空间std

#include <string>
using std::string

定义和初始化string对象

初始化类的对象是由类本身决定的,一个类可以定义很多种初始化对象的方式。

string s1               // 默认初始化,s1是一个空串   
string s2(sl)           // s2是s1的副本
string s2 = s1          // 等价于s2(s1),s2是s1的副本
string s3("value")      // s3 是字面值"value"的副本,除了字面值最后的那个空字符外
string s3 = "value"     // 等价于s3("value"),s3是字面值"value"的副本
string s4(n, 'c')       // 把s4初始化为由连续n个字符c组成的字符串

直接初始化和拷贝初始化

  • 使用等号(=)初始化一个变量,执行拷贝初始化,把等号右侧的初始值拷贝到新创建的对象中去。
  • 不使用等号(=),执行直接初始化
    初始值只有一个时,使用直接初始化或拷贝初始化都行;s4样式的初始化用到的值有多个,一般只能使用直接初始化。
string s5 = "hiya"; // 拷贝
string s6("hiya");  // 直接
string s7(10, 'c'); // 直接

多个值进行初始化的情况,也可以采用拷贝初始化,需要创建一个临时对象用于拷贝:

string s8 = string(10, 'c'); // 拷贝

string对象上的操作

os << s        // 将s写到输出流os当中,返回os
is >> s        // 从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s)  // 从is中读取一行赋给s,返回is
s.empty()      // s为空返回true,否则返回false
s.size()       // 返回s中字符的个数
s[n]           // 返回s中第n个字符的引用,位置n从0计起
s1 + s2        // 返回s1和s2连接后的结果
s1 = s2        // 用s2的副本代替s1中原来的字符
s1 == s2
s1 != s2       // 如果s1和s2中所含的字符完全一样,则它们相等:string对象的相等性判断对字母的大小写敏感
<, <=, >, >=   // 利用字符在字典中的顺序进行比较,且对字母的大小写敏感

读写string对象

cin >> s;:执行读取操作时,string对象自动忽略开头的空白(空格符、换行符、制表符等),从第一个真正的字符读起,直到遇见下一处空白。
string对象的输入输出操作返回运算符左侧的运算对象作为结果,多个输入或输出可以连写在一起。

读取未知数量的string对象

while (cin >> word){}
条件负责检测流的情况,流有效执行while语句内部的操作;遇到文件结束标记或非法输入,循环结束。

使用getline读取一整行

getline:保留输入时的空白符,参数是输入流和一个string对象,从输入流中读入内容,直到遇到换行符为止(换行符也读入),将所读内容存入string对象(不保存换行符)。

  • getline一遇到换行符就结束读取并返回结果。
  • getline返回流参数,可以使用getline的结果作为while条件。

stringemptysize操作

emptystring的成员函数,返回string对象是否为空的一个对应的bool值。
size:返回string对象的长度(字符的个数)。

string::size_type类型

  • size函数返回值的类型,使用时通过作用域操作符表明是在string中定义的。
  • 无符号整数类型,足够放下任何string对象的大小。表达式中避免混用带符号数和无符号数,有size函数就不要再使用int

比较string对象

string对象相等意味着他们的长度相同且包含的字符也完全相同。
运算符==,!=,<,<=,>,>=依照在大小写敏感的字典顺序。

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

string对象赋值

对于string,允许把一个对象的值赋给另外一个对象:

string stl(10'c'),st2; // st1的内容是cccccccccc;st2是一个空字符串
stl = st2;               // 赋值:用st2的副本替换st1的内容,此时st1和st2都是空字符串

两个string对象相加

+:得到新的string对象,前半部分是+左侧string对象所含字符,后半部分是+右侧string对象所含字符。
+=:复合赋值运算符,右侧string对象追加到左侧string对象的后面。

string sl = "hello, ", s2 = "world\n";
string s3 = sl + s2;  //s3的内容是hello,world\n
s1 += s2;             //等价于s1 = s1 + s2

字面值和string对象相加

标准库允许将字符和字符串的字面值转换为string对象,需要string对象的地方可以使用这两种字面值来替代。
当把string对象和字符及字符串字面值混在一条语句中使用时,必须确保每个加法运算符+的两侧的运算对象至少一个是string

  • C++中字符串字面值并不是标准库类型string的对象。

处理string对象中的字符

cctype头文件中定义了一组标准库函数处理字符。

alnum(c)     // 当c是字母或数字时为真
isalpha(c)   // 当c是字母时为真
iscntrl(c)   // 当c是控制字符时为真
isdigit(c)   // 当c是数字时为真
isgraph(c)   // 当c不是空格但可打印时为真
islower(c)   // 当c是小写字母时为真
isprint(c)   // 当c是可打印字符时为真(即c是空格或c具有可视形式)
ispunct(c)   // 当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)
isspace(c)   // 当c是空白时为真(即c是空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)
isupper(c)   // 当c是大写字母时为真
isxdigit(c)  // 当c是十六进制数字时为真
tolower(c)   // 如果c是大写字母,输出对应的小写字母;否则原样输出c
toupper(c)   // 如果c是小写字母,输出对应的大写字母;否则原样输出c

使用C++版本的C标准库头文件

  • C语言的头文件形如name.h,C++将这些文件命名为cname
  • 在名为cname的头文件中定义的名字从属于命名空间std

使用基于范围的for语句处理每个字符

范围for语句:遍历给定序列中的每个元素并对序列中的每个值执行某种操作。

for (declaration: expression)statement
  • expression部分是一个对象,用于表示一个序列
  • declaration 部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。
string str("Some string");
for (auto c: str) // 对于str中的每个字符
  • 使用auto关键字让编译器来决定变量c的类型,每次迭代,str的下一个字符拷贝给c

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

改变string对象中的字符的值,必须把循环变量定义为引用类型。

string str("Some string");
for (auto &c: str) // 对于str中的每个字符

处理一部分字符

访问string对象中的单个字符,使用下标,使用迭代器。
下标运算符([])接受的输入参数是string::size_type类型的值,表示要访问的字符的位置;返回值是该位置上字符的引用。

  • string对象的下标从0记起,s[s.size() - 1]是最后一个字符。
  • string对对象的下标必须大于等于0而小于s.size()
  • 下标的值称作“下标”或“索引”,任何表达式只要它的值是一个整形就能作为索引。如果某个索引是带符号类型的值将自动转换为无符号类型string::size_type
  • 访问字符之前,首先检查字符串是否为空。

使用下标执行迭代

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

使用下标执行随机访问

通过某个下标值,直接获取对应位置的字符,并不是每次都需要从前往后依次访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借力Jersey,铸就卓越RESTful API体验

目录 maven 创建 jersey 项目 运行 支持返回 json 数据对象 1. 引言 在当今数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为连接不同软件系统和服务的桥梁。RESTful API以其简洁、轻量级和易于理解的特点&#xff0c;成为了API设计的首选标准。本…

Hive函数之-posexplode()

1、概念描述&#xff1a; posexplode() 是一个内建函数&#xff0c;用于处理数组数据&#xff0c;并将数组的每个元素及其索引&#xff08;位置&#xff09;转换为两列的表格式数据。posexplode() 函数对于处理需要元素位置信息的数组特别有用。pos就是postion的缩写&#xff…

Windows双网卡上网原理以及配置方法

目录 1. 背景 2. IP路由原理 3. windows双网卡上网解决方案 3.1. 基础配置解决方案 3.2. 高阶配置解决方案 1. 背景 在windwos上使用多网卡在工作和生活中是一个常见的操作&#xff0c;比如为了获取内部消息将有线连接到内部局域网中&#xff0c;为而了访问外网又将电脑的…

华为云GaussDB部署指南:主备架构的常见问题与解决方案

文章目录 华为云GaussDB部署指南&#xff1a;主备架构的常见问题与解决方案背景介绍部署步骤1.修改主机名2.软件安装检查3.禁用交换内存4.创建数据目录并挂载5.配置NTP时钟同步6.添加资源限制参数7.修改网卡的MTU8.上传安装工具包9.编辑集群配置文件10.修改集群安装模板11.安装…

木舟0基础学习Java的第二十天(线程,实现,匿名有名,休眠,守护,加入,设计,计时器,通信)

多线程 并发执行的技术 并发和并行 并发&#xff1a;同一时间 有多个指令 在单个CPU上 交替执行 并行&#xff1a;同一时间 有多个指令 在多个CPU上 执行 进程和线程 进程&#xff1a;独立运行 任何进程 都可以同其他进程一起 并发执行 线程&#xff1a;是进程中的单个顺…

【.NET全栈】ASP.NET开发Web应用——站点导航技术

文章目录 前言一、站点地图1、定义站点地图文件2、使用SiteMapPath控件3、SiteMap类4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以编程的方式添加节点3、使用TreeView控件导航4、绑定到XML文件5、按需加载节点6、带复选框的TreeView控件 三、Menu控件1、使用Menu控…

Hutool-Guava

目录 一、Guava 二、Hutool 三、区别与联系 四、使用场景 五、Guava工具类 1.集合工具类 2.字符串工具类 3.并发工具类 六、Hutool 1.字符串工具类 2.文件工具类 Hutool 和 Guava 都是 Java 开发中非常实用的工具库&#xff0c;它们提供了许多方便的工具类和方法&am…

字节抖音电商 后端开发岗位 一面

笔者整理答案&#xff0c;以供参考 自我介绍 项目&#xff08;20分钟&#xff09; RocketMQ延时消息的底层实现 回答&#xff1a; 延时消息的实现主要依赖于RocketMQ中的定时任务机制。消息被发送到Broker时&#xff0c;会先存储在一个特定的延时消息队列中。Broker会定时扫…

c++ extern 关键字

C中的extern关键字和跨语言互操作 变量的声明与定义 extern关键字用于声明在另一个翻译单元&#xff08;文件&#xff09;中定义的变量或函数。通过extern关键字&#xff0c;可以在多个文件中访问全局变量或函数。 变量声明示例 文件&#xff1a;main.cpp #include <io…

chatglm2-6b-prompt尝试

参考https://cloud.tencent.com/developer/article/2426296 chatglm2-6b&#xff0c;通过prompt来实现zero-shot/fewshot的自然语言处理任务 import json import re import os from modelscope.utils.constant import Tasks from modelscope import Model from modelscope.pi…

再议扩散模型

目录 一、基础知识 1、数学期望 2、概率表示 3、KL散度 二、扩散过程 三、理想的去噪过程 四、真实的去噪过程 五、噪声生成 导言 笔者早些时候曾粗略看过扩散模型的流程&#xff0c;但对于底层算法&#xff08;尤其是概率论方面&#xff09;&#xff0c;理解不够透彻…

pytorch学习(五)tensorboard使用

1. 创建环境 首先创建一个环境: conda create -n pytorch conda activate pytorch 然后安装tensorboard pip install tensorboard 安装opencv pip install opencv-python 2. 简单的案例 标量和图像的显示&#xff1a; 2.1标量实现的方法是add_scalar,第一个参数是给显…

探索Puppeteer的强大功能:抓取隐藏内容

背景/引言 在现代网页设计中&#xff0c;动态内容和隐藏元素的使用越来越普遍&#xff0c;这些内容往往只有在特定的用户交互或条件下才会显示出来。为了有效地获取这些隐藏内容&#xff0c;传统的静态爬虫技术往往力不从心。Puppeteer&#xff0c;作为一个强大的无头浏览器工…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中&#xff0c;语言是连接我们的桥梁。印尼语翻译通&#xff0c;一款专为打破语言障碍而生的智能翻译软件&#xff0c;让您与印尼语的世界轻松接轨。无论是商务出差、学术研究&#xff0c;还是探索印尼丰富的文化遗产&#xff0c;印尼语翻译通都是您的…

代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零

1049. 最后一块石头的重量 II 分成两堆石头&#xff0c;一堆石头的总重量是dp[target]&#xff0c;另一堆就是sum - dp[target]。 在计算target的时候&#xff0c;target sum / 2 因为是向下取整&#xff0c;所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目录 .NET C# 使用 iText 生成PDF1 安装 iText 7 库&#xff1a;2 变量定义3 创建一个PDF4 段落5 旋转文本6 代码块7 外部链接8 内部链接9 表格10 注释11 线条12 二维码13 嵌入图像14 列表15 设置背景16 页眉17 页脚18 事件19 水印20 分栏21 源…

老古董Lisp(1):粗鲁先生Lisp再出发

粗鲁先生Lisp再出发 开始的原因 目标和梦想是最近考虑的一个问题。什么是目标&#xff1f;什么是梦想&#xff1f;梦想可以激励改变&#xff0c;目标才能实现改变。 开始这个部分的时候&#xff0c;我的梦想是什么&#xff1f;我的目标是什么&#xff1f;我想要什么&#xf…

libwebrtc.a+exosip连接fS 环境部署tips

//运行FS服务器 sudo ./freeswitch -nc -nonat //公网sudo ./freeswitch //运行客户端 sudo ./fs_cli //加载模块 load mod_av load mod_verto0.Invite交互过程 1.fs码率设置 2.用户密码改动 3.数字签名的摘要 4.FS收不到ACK 5.公网部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---栈的使用和模拟实现

文章目录 前言1.什么是栈(Stack)?2. 栈的模拟实现3.stack的使用![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.关于栈的oj题4.1.有效的括号4.2.逆波兰表达式4.3.栈的压入、弹出序列4.4.最小栈 前言 前面几篇我们学习了顺序…

Vue--Router(路由)

目录 一 Router(路由) 1.作用 2.实现步骤 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;简单来说&#xff0c;就是用来实现vue的页面之间跳转的。 我们都知道&#xff0c;使用vue必然会涉及到很多个组件&#xff0c;也就是页面&#xff0c;而页面之间肯定需…