《C++ Primer》第3章 字符串、向量和数组(一)

news2024/7/6 18:07:11

参考资料:

  • 《C++ Primer》第5版
  • 《C++ Primer 习题集》第5版

3.1 命名空间的using声明(P74)

作用域操作符 :: 表示从左侧名字所示的作用域中寻找右侧名字,因此 std::cin 的意思就是使用命名空间 std 中的 cin

为了方便并安全地使用命名空间中的成员,可以使用 using 声明。

每个名字都需要独立的using声明

using std::cin;
using std::cout;

用到的每个名字必须有自己的声明语句,每条声明语句必须以分号结束。

头文件不应包含using声明

由于头文件中的内容可能会拷贝到其他文件中,很可能导致名字冲突。

3.2 标准库类型string(P75)

string 可表示变长的字符序列,定义在命名空间 std 中:

#include<string>
using std::string;

3.2.1 定义和初始化string对象(P76)

一个类可以定义多种初始化方式,这些方式要么初始值类型不同,要么初始值数量不同。string 类最常见的初始化方式有:

image-20230912184917241

直接初始化和拷贝初始化

使用 = 初始化对象实际上执行的是拷贝初始化,反之则执行的是直接初始化。当初始值只有一个时,两种方法都可以;当初始值有多个时,拷贝初始化必须显式创建一个临时对象用于拷贝:

string s7(10, 'c');
string s8 = string(10, 'c');

3.2.2 string对象上的操作(P77)

微信图片_20230912190215

读写string对象

string s;
cin >> s;    // 假设输入“   hello   ”
cout >> s;    // 输出“hello”

使用 >> 将内容读取到 s 中时,string 对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白为止。

读取未知数量的string对象

while(cin>>s){
    /* ... */
}

使用getline读取一整行

如果希望保留输入中的空白符,可以使用 getline 函数。getline 函数的参数是一个输入流和一个 string 对象,函数从输入流中读取内容,直到遇到换行符位置(换行符也被读进来了),然后把读到的内容存入 string 对象中(不存换行符)。getline 的返回值它的流参数,同样可用于条件判断:

while(getline(cin, s)){
    /* ... */
}

stringemptysize操作

string::size_type 类型

size 函数的返回类型为 string::size_type 。大多数标准库类都定义了几种配套类型,体现了标准库类型与机器无关的特性。

string::size_type 是一个无符号的值,并且足够存下任何 string 对象的大小;任何用于存放 stringsize 函数返回值的变量都应是 string::size_type 类型:

auto len = s.size();

当表达式中有 size() 时,不要再使用 int

比较string对象

字典序。

string对象赋值

string s1, s2("hello");
s1 = s2;

两个string对象相加

运算结果为两个运算对象的串接。

字面值和string对象相加

标准库允许把字符字面值和字符串字面值转换成 string 对象。当把 string 对象和字面值混用在一条加法时,必须保证每个 + 两侧至少有一个对象为 string

string s("hello");
s = s + "," + "world";    // 正确,第一个加号运算后得到string对象
s = "world" + "," + s;    // 错误

为了和 C 语言兼容,C++ 中的字符串字面值不是 string 对象。例如,"hello" 的类型为 const char[7]

3.2.3 处理string对象中的字符(P81)

image-20230912193638884

C++ 兼容了 C 语言的标准库,例如,C 语言存在头文件 name.h ,则 C++ 中对应的头文件为 cname 。需要说明的是,cname 中的名字定义在 std 中,而 name.h 则不然,所以 C++ 程序应该使用 cname 头文件。

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

如果想对字符串中的每个字符进行操作,最好的方法是使用范围 for 语句:

for(declaration : expression)
    statement

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

每次迭代都对变量进行初始化,应该是为了保证范围 for 语句能使用引用变量。

string s("hello");
for(auto c : s){
    cout << c << ' ';
}

这里 auto 推断出的类型为 char

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

想要改变 string 对象的值,必须把范围 for 循环中的变量定义成引用类型:

string s("hello");
for(auto &c : s){
    c = toupper(c);
}

只处理一部分字符?

想要访问 string 对象中的单个字符有两种方式:使用下标、使用迭代器。

下标运算符 [] 接受的输入参数为 string::size_type 类型,返回值为该位置上字符的引用string 类型的下标必须大于等于 0 且小于其 size

使用下标执行迭代

string s("hello");
// 依次处理s中的字符,知道遇到空格或结尾。
for(decltype(s.size()) index=0;index!=s.size()&&!isspace(s[index]);s++){
    s[index] = toupper(s[index]);
}

上面的代码中,&& 运算符只有当左侧为真时才会检查右侧,所以必须先判断 index合法性,再对对应的字符进行判断。

使用下标执行随机访问

练习

image-20230912201428570

s[index] = toupper(s[index]);
}


上面的代码中,`&&` 运算符只有当左侧为真时才会检查右侧,所以必须先判断 `index` 的**合法性**,再对对应的字符进行判断。

### 使用下标执行随机访问

### 练习

[外链图片转存中...(img-lnn8ZDjY-1694521712024)]

> 合法,c 为**字符常量的引用**

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

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

相关文章

JAVA -华为真题-分奖金

需求: 公司老板做了一笔大生意&#xff0c;想要给每位员工分配一些奖金&#xff0c;想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序&#xff0c;每个人随机抽取一个数字。按照工号的顺序往后排列&#xff0c;遇到第一个数字比自己数字大的&#xff0c;那么&#xf…

【IoT】生产制造:锅仔片上机做 SMT 加工吗?

目录 简介 锅仔片 简介 由于最近做产品用到了锅仔按键&#xff0c;由于单品用量过多&#xff0c;但是成品锅仔按键价格又太高&#xff0c;不适合量产。 这个时候就想到了锅仔片&#xff0c;问题又来了&#xff0c;锅仔片是否可以上机呢&#xff1f; 答案是肯定的。 锅仔片…

Pytest系列-使用自定义标记mark

简介 pytest 可以支持自定义标记&#xff0c;自定义标记可以把一个 web 项目划分为多个模块&#xff0c;然后指定模块名称执行 Pytest 里面自定义标记 用法&#xff1a;将pytest.mark.标记名称 放到测试函数或者类上面 使用&#xff1a; 执行时加上 -m 标记名 进行用例筛选…

K8S:Yaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例&#xff08;1&#xff09;相关标签介绍&#xff08;2&#xff09;Deployment类型编写nginx服务&#xff08;3&#xff09;k8s集群中的port介绍&#x…

Revit SDK 介绍:TraverseSystem 用广度遍历的方式遍历MEP系统

前言 这个例子介绍了用广度遍历的方式遍历MEP系统。 内容 打开 Revit 自带例子&#xff0c;选择红框中的某条风管&#xff0c;不要选择机械&#xff0c;图中选中只是为了和遍历结果对应&#xff1a; 红色区域到风管机的遍历结果&#xff1a; 核心逻辑 遍历逻辑主函数&am…

Visual Studio将C#项目编译成EXE可执行程序

经常看文章时会收获不少实用工具&#xff0c;有的在github上是编译好的&#xff0c;有的则是未编译的项目文件。所以经常会使用Visual Studio编译项目文件成exe可执行程序&#xff0c;以下为编译的流程。 第一步&#xff0c;从github上下载项目文件&#xff0c;举个例子&#…

解决`SQLyog Trial`试用到期的问题(提供一个脚本解决方案)

文章目录 一、要删除的注册表项二、写了个脚本干这个事儿三、最后 本文将总结SQLyog Trial试用到期的问题。 其实解决起来很简单&#xff0c;就是将SQLyog相关注册表删掉即可 一、要删除的注册表项 WinR打开运行&#xff0c;输入regedit回车&#xff0c;打开注册表 在HKEY_C…

基于Elasticsearch的多文档检索 比如 商品(goods)、案例(cases)

概述 Elasticsearch多文档聚合检索 详细 记得把这几点描述好咯&#xff1a;需求&#xff08;要做什么&#xff09; 代码实现过程 项目文件结构截图 演示效果 应用场景 我们需要在五种不同的文档中检索数据。 比如 商品&#xff08;goods&#xff09;、案例&#xff08;ca…

汇编程序设计MOOC精选题

一、微型计算机基础 1.微型计算机各部件之间是用&#xff08;系统总线&#xff09;连接起来的 2.冯诺依曼结构确定计算机的五个基本部件&#xff1a;i/o&#xff0c;存储器、控制器和&#xff08;运算器&#xff09; 微处理器通过&#xff08;数据&#xff09;总线 向存储器和…

java程序处理三张表要进行怎么样的操作

首先第一步梳理思路&#xff0c;id没有存在说明是新添加的&#xff0c;如果id存在那就是对现有文章的修改。 /*** 发布文章或保存草稿** param dto* return*/Overridepublic ResponseResult submitNews(WmNewsDto dto) {//0.条件判断if(dto null||dto.getContent() null){ret…

CKA 真题练习(十六)备份还原etcd

题目&#xff1a; 首先&#xff0c;为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db (注意&#xff0c;真实考试中&#xff0c;这里写的是 https://127.0.0.1:2379) 为给定实例创建快照预计能在几秒钟内完成。 …

Java 时间范围

前端使用Element-ui 时间范围组件 后端注意在Vo里面时间设置String类型不要设置Date类型 XMl组件字段映射成功性

【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

转载知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具 项目地址&#xff1a;赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码&#xff0c;基于Cocos Creator 3.5版本实现 在上一节的课程中&#xff0c;您已经实现了通过触控给刚体施…

LIO-SAM论文与代码总结

看了一些注释版的代码和博客&#xff0c;很多都很详细&#xff0c;但是有的看起来比较绕&#xff0c;或者对一些名词和定义的解释有歧义&#xff0c;不一定就说错了&#xff0c;但是仍然不方便自己理解&#xff0c;所以自己梳理一下&#xff0c;顺便记录。 目录 原文附带架构…

js 小数相乘后,精度缺失问题,记录四舍五入,向下取整

在做项目的时候&#xff0c;有一个计算金额的&#xff0c;结果发现计算的金额总是缺失0.01&#xff0c;发现相乘的时候&#xff0c;会失去精度&#xff0c;如图所示。被这整的吐血&#xff0c;由于计算逻辑由前端计算&#xff0c;所以传值后端总出错(尽量后端计算)。 还发现to…

React Native 环境配置(mac)

React Native 环境配置&#xff08;mac&#xff09; 1.Homebrew2.Node.js、WatchMan3.Yarn4.Android环境配置1.安装JDK2.下载AndroidStudio1.国内配置 Http Proxy2.安装SDK1.首先配置sdk的路径2.SDK 下载 3.创建模拟器4.配置 ANDROID_HOME 环境变量 5.IOS环境1.升级ruby&#x…

SQL8 查找某个年龄段的用户信息

描述 题目&#xff1a;现在运营想要针对20岁及以上且23岁及以下的用户开展分析&#xff0c;请你取出满足条件的设备ID、性别、年龄。 用户信息表&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543…

神经网络 06(优化方法)

一、优化方法 网络搭建好&#xff0c;损失函数设计好之后&#xff0c; 根据损失函数更新参数(权重&#xff0c;偏移)。参数更新过程就是一个神经网络优化过程。 二、梯度下降方法 梯度下降法简单来说就是一种寻找使损失函数最小化的方法。从数学上的角度来看&#xff0c;梯度…

仿东郊到家app系统及功能介绍

类似东郊到家app系统开发&#xff0c;预约sap东郊到家软件定制开发&#xff0c;东郊到家小程序APP开发&#xff0c;东郊到家模式系统定制开发 一、东郊到家软件介绍 1、东郊到家app是一家以推拿为主项&#xff0c;个人定制型的o2o平台&#xff0c;东郊到家app平台提供、正规、安…

计算即时订单比例-首单使用开窗函数row_number()

1 需求 即时订单和计划订单 订单配送中&#xff0c;如果期望配送日期和下单日期相同&#xff0c;称为即时订单&#xff0c;如果期望配送日期和下单日期不同&#xff0c;称为计划订单。 请从配送信息表&#xff08;delivery_info&#xff09;中求出每个用户的首单&#xff08;用…