C++primer(第五版)第三章(字符串、向量和数组)

news2024/12/27 11:42:27

本章主要介绍了字符串和vector以及数组,但是vector和数组差不多甚至比数组更加强大,完全可以用vector来代替数组,所以尽管书中有介绍数组,但我也不过多记录,有兴趣的小伙伴可以自行查看原书。

3.1命名空间的using声明

我们使用的库函数基本上都属于命名空间std,每次使用对应的成员都需要在前面加上std:: 这样会比较繁琐,所以我们可以如下使用using声明,这是最安全的方法.

using namespace::name;
//例如

using std::cout;
cout<<"hello world"<<std::endl; //std::cout在前面声明过了,所以可以直接使用

每个成员都需要单独进行声明,可以在一行里全部声明完,但是需要用分号;进行区分.

头文件不应包含using声明.

3.2标准库类型string

标准库类型string表示可变长的字符序列.完整的类型写法为std::string

3.2.1定义和初始化string对象

 其中最常用的(对我而言)是第1,3,5种方法.

如果使用等号初始化一个变量,也就是第三种和第五种方法,实际上执行的是拷贝初始化,编译器把等号右侧初始值拷贝到新创建的对象中.如果不使用等号,则是直接初始化.

3.2.2string对象上的操作

使用io操作费读取string会自动忽略开头的空白(空白符,换行符,制表符),然后从第一个有效字符开始,直到遇到下一处空白,例如:

#include <iostream>
using namespace std;
int main(){
    string s;
    cin >> s;
    cout << s <<endl;
    return 0;
}

//输入"     helloWorld     "
//输出"helloWorld"

我们可以看出来用io操作符来给string赋值是不包含空白的,如果我们非要,那么可以使用getline函数.

getline(输入流对象,string对象)

#include <iostream>
using namespace std;
int main(){
    string s;
    getline(cin,s);
    cout << s <<endl;
    return 0;
}

//输入"     helloWorld     "
//输出"     helloWorld     "

 getline会一直读取直到遇到换行符,同时换行符也会被读取,但是string对象不保存换行符.

string对象包含函数size,可以获取string对象的长度,获取的长度类型为 string::size_type,记不住的话可以用auto来接收size函数的返回值,但是要记住,string::size_type是无符号类型,所以不能够将无符号和有符号的数据混用.

string s = "hello world";
auto LEN1 = s.size();
string::size_type LEN2=s.size():

string对象可以直接相加,然后赋值给新的string对象,也可以string和字面量相加,但是不能字面量和字面量相加.

"hello world" //这是字面量
string s = "hello world"  //这是string对象

3.2.3处理string对象中的字符

C++标准库兼容C语言的标准库,例如C语言的标准库叫ctype.h,那么C++兼容的标准库则去掉.h后缀,然后在开头再加个c,例如cctype:

 C++中的范围for(类似于Java的增强for)可以依次获取可迭代对象的元素.

for(adeclaration : expression){

        //操作

}

string s = "hello world";
for ( char x : s ){
    cout << x << ' ';
}
//输出 "hello world";

 如果要修改迭代的结果,那么把循环变量的类型改成引用类型.

C++标准不要求编译器(但是好像有一些编译器会检测)检测下标是否合法,一旦下标越界那么会产生不可预测的结果.string对象的下标要求范围为[0,string.size())(左闭右开).

3.3标准库类型vector

可以把vector看作加强版数组. 

vector属于类模板,可以包含大多数类型的对象作为其元素,但是不可以存放引用类型,因为引用不是对象.如果vector的元素类型还是vector,在C++11之前,必须在外层的vector对象的右尖括号和其元素类型直接添加一个空格,例如:

vector<vector<int> >  //C++11之前
vector<vector<int>>   //C++11

3.3.1定义和初始化vector对象

 如果vector初始化的元素类型不支持默认初始化(例如int类型默认为0)那么则不能使用第五种方法,而必须提供初始化的元素值.

push_back(val)可以将元素添加至vector的尾部,但使用范围for的时候不能使用该函数.或者说所有可迭代对象在使用范围for的时候都不可以改变对象的大小.

3.3.3其他vector操作

vector对象可以使用下标运算符[]访问已存在的函数,但是不可以用下标运算符添加元素.保证下标合法的有效手段就是使用范围for语句!

3.4迭代器

所有标准库容器(包括vector在内,书的后面章节还会介绍更多.严格来说string不属于容器类型,但是string支持很多与容器类型相似的操作)都可以使用迭代器.简单来说迭代器就是指针.可以通过解引用迭代器来获取相应的数据.

但是和指针不一样的是,获取迭代器不是用取地址符&,而是用有迭代器的类型自带的函数:

vector<int> a(10,1);
auto b = a.begin();  //实际上类型为vector<int>::iterator,但是这里我们暂时用auto代替
auto e = a.end();    //但如果对象是常量,那么类型就是const_iterator

迭代器支持的运算符如下:

 书中提醒,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素.

3.4.2迭代器运算

 两个迭代器相减得到的是两个迭代器之间的距离,类型为differece_type,记不住可以用auto来接收,只需要知道它是带符号的整型数.

3.5数组

C++中数组和C语言的基本上一致,并且推荐用vector来代替数组,这里我就不多介绍,感兴趣的可以自行去看原书.

3.6多维数组

关于多维数组,严格来说,C++并没有多维数组,通常我们说的多维数组其实是数组的嵌套,即数组的元素为数组,对于二维数组,通常把第一个维度称作行(row),第二维度成为列(col).

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

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

相关文章

MySQL-SQL InnoDB引擎 (上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

使用VuePress生成静态网站并部署到github

目录 第一步 安装VuePress第二步 书写博客第二步 部署到github 第一步 安装VuePress VuePress是一个基于Vue驱动的静态网站生成器 相关资料 文档&#xff1a;https://v1.vuepress.vuejs.org/zh/github: https://github.com/vuejs/vuepressvuepress-deploy: https://github.c…

在 CentOS 7/8 上安装 NVIDIA Container Toolkit

文章目录 设置存储库和 GPG 密钥更新包列表后安装 nvidia-container-toolkit 包&#xff08;和依赖项&#xff09;配置 Docker 守护进程以识别 NVIDIA 容器运行时设置默认运行时后&#xff0c;重新启动 Docker 守护进程以完成安装测试 参考官方文档&#xff0c;在 CentOS 7 上…

测试用例设计简单吗?简单!但你有可能栽在这5道S级测试用例设计题上!(附答案)

很多人不知道写测试用例有什么用&#xff0c;而仅仅是像工具人一样&#xff0c;在每次提测之前&#xff0c;把测试用例照着需求文档抄一遍&#xff0c;仿佛像是走个过场。 开发提测之后&#xff0c;就照着测试用例点点点&#xff0c;可能一天就走完用例了&#xff0c;开发代码写…

Spring专家课程Day01_Spring-IOC

​ 文章目录 基础配置1)基础文件结构(Maven项目创建) 一、01_Spring概述_IOC_HelloWorld1.Spring框架的两个核心功能1.1) IOC/DI ,控制反转依赖注入!1.2) AOP,面向切面编程 2.IOC的两种模式2.1)配置文件中配置 Bean2.2)配置文件,组件扫描注解类注解Component 二、02_JavaBean_J…

数睿通2.0功能发布—集成Doris、数仓动态配置、质量任务完善、接入速度优化

文章目录 引言集成 Doris数仓动态配置质量任务完善接入速度优化结语 引言 数睿通 2.0 数据中台迎来了 6 月份的更新&#xff0c;本次更新集成了 Doris 数据库&#xff0c;可用于数据集成&#xff0c;数据开发等模块。过去数仓使用的是 TiDB&#xff0c;新版本可以根据自身需求…

记一次移动九联UNT401H电视盒子免拆刷机(图文详细教程 附所有软件)

文章目录 1.准备1.硬件介绍2.刷机硬件3.相关软件1.刷机软件2.工具软件 2.刷机1.开启adb2.查看IP地址3.写入recovery4.刷入系统 3.系统使用1.首次启动2.安装第三方软件安装blibili tv看IPTV 4.总结附&#xff1a; 声明&#xff1a;本安卓固件&#xff0c;仅供内部测试和技术交流…

vue element UI在button按钮使用 @keyup.enter不生效

如图所示&#xff0c;没效果。在按钮上绑定keyup事件&#xff0c;加上.native覆盖原有封装的keyup事件 解决办法 created () {document.onkeyup e > {if (e.keyCode 13 && e.target.baseURI.match(/login/)) {// 调用登录 验证方法this.submitForm()}}}成功解决&…

Java 使用hutool工具进行导出excel表格(代码很简单)

1.先引入hutool的相关依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.4</version></dependency><dependency><groupId>org.apache.poi</…

【youcans动手学模型】SqueezeNet 模型-CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】SqueezeNet 模型-CIFAR10图像分类 1. SqueezeNet 卷积神经网络模型1.1 模型简介1.2 论文介绍1.3 分析与讨论 2. 在 PyTorch 中定义 SqueezeNet 模型类2.1 定义 Fire Module2.2 …

少有人告诉你!工科硕士对应届生的肺腑之言!

自己是电子信息工科硕士狗一枚&#xff0c;自认为毕业于985院校还可以。刚毕业时&#xff0c;去了一家世界500强公司&#xff0c;校招签约时只说是“技术岗”&#xff0c;没有指定具体岗位。等待毕业的时间里&#xff0c;对新公司、新岗位充满了无限的期待&#xff0c;认为自己…

5、R语言所需安装包安装教程

一、R包安装 1.鼠标右键&#xff0c;以管理员的身份运行&#xff0c;然后点击确定。 2.点击安装导向中的下一步。 3.修改安装路径&#xff0c;安装到自己所需的路径&#xff0c;然后点击下一步。 4.勾选自己所需组件&#xff0c;然后点击下一步。 5.启动选项&#xff0c;选…

百万奖金悬赏大模型不擅长的任务!这 11 个任务模型越大,效果越差!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 去年咱们在介绍百万悬赏时提到&#xff0c;“海量资源砸出的大模型真的会一直那么香吗&#xff1f;”&#xff0c;目前来看&#xff0c;自打 ChatGPT 横空出世引领一众大模型开辟新的生活和工作方式以来&#xff0c;还是挺香的…

vue — 高德地图实现来回切换卫星图

默认初始化地图展示标准3d地图&#xff08;这里添加蒙层&#xff09; initMap () {this.mapObj new AMap.Map(mapContainer, {features: [bg, road, point, building],showLabel: true,rotateEnable: false,pitchEnable: false,zoom: 17,pitch: 65,rotation: 45,viewMode: 3D,…

一起学SF框架系列4.8-模块context-事件机制(Event)

ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口提供的。如果将实现ApplicationListener接口的bean部署到上下文中&#xff0c;则每次将ApplicationEvent发布到ApplicationContext时&#xff0c;都会通知该bean。从本质上讲&#xff0c;这是…

Allegro如何使用打印预览功能操作指导

Allegro如何使用打印预览功能操作指导 Allegro时常需要使用打印功能,将某个视图打印成pdf文件,如下图 在打印成pdf文件之前,可以使用打印预览的功能,具体操作如下 点击shape Add Rect命令Options出现如下选项<

阿里云地域和可用区分布表

阿里云服务器地域和可用区有哪些&#xff1f;阿里云服务器地域节点遍布全球29个地域、88个可用区&#xff0c;包括中国大陆、中国香港、日本、美国、新加坡、孟买、泰国、首尔、迪拜等地域&#xff0c;同一个地域下有多个可用区可以选择&#xff0c;阿里云服务器网分享2023新版…

Nginx的Location和Rewrite

目录 Rewrite简介 1.0 Rewrite实际场景 1.1 Rewrite跳转场景 1.2 Rewrite跳转实现 1.3 Nginx正则表达式 1.4 Rewrite命令&&语法格式 1.5 flag标记说明 2 Location分类 2.1 Location优先级 3 Rewrite&&Location比较 4 场景跳转实验 4.1 基于域名的跳转 …

vcruntime140.dll无法继续执行代码怎么办

今天打开photoshop软件的时候&#xff0c;突然间就打不开&#xff0c;电脑报错由于找不到vcruntime140.dll&#xff0c;无法继续执行此代码&#xff0c;然后我就把photoshop卸载了&#xff0c;再重新安装&#xff0c;依然还是报错。这个可怎么办&#xff1f;vcruntime140.dll如…

【笔记】肥胖代码:减肥的秘密

直接原因与根本原因 直接原因与根本原因的区别是什么&#xff1f;直接原因是直接造成体重增加的原因&#xff0c;根本原因是导致事物发生变化的根源。 以酗酒为例。酗酒的原因是什么&#xff1f; 直接原因是饮酒过量。这是不可否认的事&#xff0c;但显然不能解决问题。直接…