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

本章主要介绍了字符串和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).

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS_列表和列表项

目录 1. 什么是列表和列表项&#xff1f; 1.1 列表 1.2 列表项 1.3 迷你列表项 2. 列表和列表项初始化 2.1 列表初始化 2.2 列表项初始化 3. 列表项插入 3.1 列表项插入函数分析 3.2 列表项插入过程图示 3.2.1 插入值为 40 的列表项 3.2.2 插入值为 60 的列表项 3…

【二】构造函数和原型

ES6&#xff08;ECMAScript 6.0&#xff09;之前js没有引入类的概念 在ES6之前&#xff0c;对象不是基于类创建的&#xff0c;而是用一种称为构建函数的特殊函数来定义对象和它们的特征 ES6之前创建对象可以通过以下三种方式创建对象&#xff1a; 对象字面量&#xff1a; v…

【Spring AOP】面向切面编程,面向切面编程是面向对象编程的孪生兄弟嘛?且听我细细道来! ! !

前言: 大家好,我是良辰丫,面向切面编程和面向对象编程是两种几乎不同的编程方式,并不是所谓的孪生兄弟,但是我们可以说面向切面编程是面向对象编程的一种补充和完善,到底是什么意思呢?请跟随良辰的步伐往下瞧! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主…

TypeScript ~ 掌握基本类型 ①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

Redis原理 - IO详解

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis原理 - IO详解 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-IO.html 用户空间与内核空间 任何Linux 系统的发行版&#xff0c;其系统内核都是 Linux 。我们的应用都需要通过 Linux 内核与硬…

怎么给PDF添加图片水印?其实很简单,看这篇就会了!

许多人都意识到版权问题的重要性&#xff0c;尽管在日常生活中我们可能很少遇到&#xff0c;但在办公和学习中却经常涉及到此类问题。例如&#xff0c;我们辛辛苦苦制作的PDF文件&#xff0c;如何确保不被他人盗用呢?这就涉及到如何为PDF添加图片水印的问题&#xff0c;相当于…

经典基于外观的SLAM框架-RTABMAP(RGBD视觉输入方案)

经典基于外观的SLAM框架-RTABMAP 文章目录 经典基于外观的SLAM框架-RTABMAP1. RTABMAP整体框架2.RTABMAP的内存管理机制3. 视觉里程计4. 局部地图5. 回环检测与图优化6. 代码工程实践 1. RTABMAP整体框架 RTABMAP是采用优化算法的方式求解SLAM问题的SLAM框架&#xff0c;本赛题…

【python 第三方库安装换源】

换源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/其他国内第三方库的下载源地址&#xff1a; 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 科技大学&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣&a…

Vue实例知识点分享

文章目录 导文下面是创建 Vue 实例的基本步骤 常用的 Vue 实例方法和属性总结 导文 Vue的实例是用来创建 Vue 应用程序的对象。通过实例化 Vue 构造函数&#xff0c;我们可以创建一个具有响应式数据、计算属性、方法和生命周期钩子等特性的 Vue 实例。 下面是创建 Vue 实例的基…

python技术分享

文章目录 python介绍应用领域环境搭建基础知识编程工具变量基本数据类型容器数据类型程序结构运算符函数类 技巧总结python内存管理python常用技术python的缺陷优化python的编码规范提升性能总结 python介绍 弱类型的语言 声明一个变量&#xff0c;直接赋值即可&#xff0c;简…

Android强大的原生调试工具adb的常用命令

文章目录 ADB简介常用命令列出链接的设备进入设备的shell环境设备日志安装应用程序卸载应用程序将本地文件复制到调试设备上将设备上的文件拉取到本地启动程序强制停止程序运行截图屏幕录制列出调试设备所有的应用的报名 结语 ADB简介 ADB&#xff08;Android Debug Bridge&am…

【从零开始学习JAVA | 第二十一篇】常见API介绍 System

目录 前言&#xff1a; System&#xff1a; System类中静态方法&#xff1a; 总结&#xff1a; 前言&#xff1a; system 是一个很底层的 API&#xff0c;是一个工具类&#xff0c;提供了一些与系统相关的方法。他在我们写项目的时候提供了一些非常实用的方法&#xff0c;本…

量子机器学习Variational Quantum Classifier (VQC)简介

变分量子分类器&#xff08;Variational Quantum Classifier&#xff0c;简称VQC&#xff09;是一种利用量子计算技术进行分类任务的机器学习算法。它属于量子机器学习算法家族&#xff0c;旨在利用量子计算机的计算能力&#xff0c;潜在地提升经典机器学习方法的性能。 VQC的…

优化--分类树,我从2s优化到0.1s

1.前言 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在电商系统中。 但就是这样一个简单的分类树查询功能&#xff0c;我们却优化了5次。 到底是怎么回事呢&#xff1f; 2.背景 我们的网站使用了SpringBoot推荐的模板引擎&#xff1a;Thym…

【Python实战】Python采集情感音频

成年人的世界真不容易啊 总是悲伤大于欢喜 爱情因为懵懂而快乐 却走进了复杂和困惑的婚姻 前言 我最近喜欢去听情感类的节目&#xff0c;比如说&#xff0c;婚姻类&#xff0c;我可能老了吧。我就想着怎么把音乐下载下来了&#xff0c;保存到手机上&#xff0c;方便我们业余时…

Jnpf低代码开发平台

一、写在前面 低代码开发平台&#xff0c;一个号称能在几分钟的时间里开发出一套公司内部都可使用的应用系统开发工具。 很多人或许都隐隐听说过低代码&#xff0c;因为低代码不仅远名国外&#xff0c;国内的腾讯、阿里、华为、网易、百度等科技巨头也纷纷入局&#xff0c;足以…

URL到页面: 探索网页加载的神秘过程

当我们从浏览器的地址栏输入 URL, 按下回车, 再到最后出现需要的网页界面, 这中间究竟发生了什么, 接下来就一步步进行解析. 主要是如下过程: 输入网址DNS 解析客户端发送 HTTP 请求建立 TCP 连接服务器处理请求, 计算响应, 返回响应浏览器渲染页面关闭连接 本篇中只是概述整…

docker 操作手册

名词解释 images&#xff1a;封装了应用程序的镜像 tag&#xff1a;镜像的标记&#xff0c;一个镜像可以创建多个标记 container&#xff1a;装载镜像并运行 常用命令 查看容器 docker ps -a //查看全部镜像 启动容器 docker start mysql //启动mysql容器 停止容器 doc…

Maven(三):Maven的组成详解

文章目录 坐标和依赖坐标详解依赖配置依赖范围传递性依赖依赖调节可选依赖优化排除依赖归类依赖优化依赖 仓库本地仓库远程仓库仓库镜像常用搜索地址 生命周期与插件三套生命周期clean生命周期default生命周期site生命周期 插件 聚合与继承更加灵活的构建常见问题使用jdk来运行…

TuyaOS 开发固件OTA上传固件指南

文章目录 一、产品创建二、TuyaOS设备开发三、固件上传 通过TuyaOS接入涂鸦云的产品全部默认支持固件OTA功能&#xff0c;TuyaOS设备实现固件OTA需要&#xff1a; 自定义产品创建TuyaOS嵌入式开发固件上传固件OTA配置与发布 等步骤实现产品OTA。本文重点讲述TuyaOS开发模式下&…