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

news2025/1/18 17:10:00

参考资料:

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

3.3 标准库类型vector(P86)

vector 表示对象的序列,其中所有对象的类型相同,每个对象都有一个与之对应的索引。vector 容纳着其他对象,所以常被称作“容器”。

vector 是一个类模板,使用模板时,我们需要提供一些信息来指定模板需要实例化成什么类,提供信息的方式为:在模板名字后跟一对尖括号,在括号内放入信息:

vector<int> ivec;

由于引用不是对象,所以不存在包含引用的 vector

在早期的 C++ 版本中,嵌套 vector 需要写成 vector<vector<int> > ,而非 vector<vector<int>>

3.3.1 定义和初始化vector对象(P87)

image-20230913140124556

最常见的初始化方法就是定义一个空 vector 。使用拷贝初始化时,必须保证两个 vector 对象的类型相同。

列表初始化vector对象

C++11 为了 vector 提供了列表初始化方法:

vector<string> articles{"a", "an", "the"};

列表初始化只能使用花括号

创建指定数量的元素

可以提供 vector 对象容纳的元素数量统一初始值来初始化 vector 对象:

vector<int> ivec(10, -1);

值初始化

如果我们只提供元素数量而不提供元素初始值,库会创建一个值初始化的元素初值,并把它赋给容器中的所有元素。如果 vector 对象的元素是内置类型,则元素初始值为 0 ,如果元素是某种类类型,则元素由类默认初始化

这种初始化方法有两个限制:

  • 如果有些类要求提供初始值,只提供元素数量就无法完成初始化操作。
  • 只能使用直接初始化。
vector<int> ivec1(10);    // 正确
vector<int> ivec2 = 10;    // 错误

列表初始值还是元素数量?

某些情况下,初始化的真实含义依赖于传递初始值时使用的时花括号还是圆括号。如果使用圆括号,可以理解为提供的值是用来构造 vector 对象的;如果使用花括号,可以理解为我们列表初始化 vector 对象,所以初始化过程会尽可能把花括号内的值当作元素初始值的列表,在无法执行列表初始化时才会考虑其他方式。

vector<int> v1;    // 空
vector<int> v2(10);    // 10个值为0的元素
vector<int> v3(10, 42);    // 10个值为42的元素
vector<int> v4{10};    // 1个值为10的元素
vector<int> v5{10, 42};    // 两个元素,值分别为10和42
vector<string> v6{10};    // 10个空字符串
vector<string> v7{"a", "an"};    // 两个元素,值分别为"a"和"an"

3.3.2 向vector对象中添加元素(P90)

push_back 可以把一个值当成 vector 对象的为元素压到 vector 对象的尾端。

C++ 要求 vector 能在运行时高效添加元素,所以在创建 vector 时指定其大小是没有必要的,且往往会导致性能下降。例外情况是所有元素的值都一样。

向 vector 对象添加元素蕴含的编程假定

范围 for 循环不应改变其遍历序列的大小。

3.3.3 其他vector操作(P91)

image-20230913143535067

size 的返回类型是由 vector 定义的 size_type 类型:

vector<int>::size_type    // 正确
vector::size_type    // 错误

计算vector内对象的索引

不能使用下标形式添加元素

vector<int> ivec(10, 0);
ivec[10] = 1;    // 错误

下标运算符用于访问已经存在的元素。使用下标访问不存在的元素不会被编译器发现,而是在运行时产生一个不可预知的值,并常常导致缓冲区溢出

3.4 迭代器介绍(P95)

所有标准库容器都可以使用迭代器(iterator)访问其元素。迭代器类似于指针类型,提了对象的间接访问,迭代器可以访问某个元素,也能从一元素移动到另一个元素。迭代器有无效有效之分,有效的迭代器指向某个元素,或者指向尾元素的下一个位置

3.4.1 使用迭代器(P95)

有迭代器的类型同时拥有返回迭代器类型的成员

vector<int> ivec(10, 0);
auto b = ivec.begin(), e = ivec.end();

begin 用于返回指向第一个元素的迭代器,end 用于返回指向尾后元素的迭代器。特别地,如果 vector 为空,则 beginend 返回的是同一个迭代器。

迭代器运算符

image-20230913150510928

试图解引用尾后迭代器和无效迭代器是未定义行为。

将迭代器从一个元素移动到另一个元素

所有标准库容器的迭代器都定义了 ==!= ,但只有少数定义了 < 运算符,所以我们常常使用 it != v.end() 作为循环条件。

迭代器类型

拥有迭代器的标准库类型使用 iteratorconst_iterator 来表示迭代器。const_iterator 和常量指针类似。

beginend运算符

beginend 的返回类型有对象是否是常量决定:

vector<int> v;
const vector<int> cv;

auto it1 = v.begin();    // it1的类型为vector<int>::iterator
auto it2 = cv.begin();    // it2的类型为vector<int>::const_iterator

为了得到 const_iterator 类型,C++11 引入了 cbegincend

结合解引用和成员访问操作

it->mem 等价于 (*it).mem

某些对vector对象的操作可能会使迭代器失效

任何可能改变 vector 对象容量(如 push_back )的操作都会导致该对象的迭代器失效。

使用了迭代器的循环体,不要向迭代器所属的容器添加元素。

3.4.2 迭代器运算(P99)

所有标准库容器的迭代器都支持 ++==!=stringvector 的迭代器还提供了更多额外的迭代器运算

image-20230913154717627

迭代器的算术运算

两个迭代器相减得到的是类型为 difference_type带符号整数

使用迭代器运算

image-20230913155009097

[外链图片转存中…(img-u5ChYVMZ-1694591574896)]

迭代器的算术运算

两个迭代器相减得到的是类型为 difference_type带符号整数

使用迭代器运算

image-20230913155009097

mid = (beg+end) /2 代替 mid = beg + (end-beg)/2 可行吗?不可行,因为迭代器的加法不存在。

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

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

相关文章

Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)

目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回&#xff0c;使…

springboot对接postgres

安装postgres 注意:下述链接方式会自动创建数据库steven_russell,若需要创建其他数据库&#xff0c;可以手动执行命令创建数据库 docker run --name postgres \ -p 5432:5432 \ -e POSTGRES_USERsteven_russell \ -e POSTGRES_PASSWORD123456 \ -itd --privilegedtrue postgre…

【卖出看涨期权策略(Short Call)】

卖出看涨期权策略&#xff08;Short Call) 卖出看涨期权策略又称为卖出无备兑看涨期权&#xff0c;如果一个投资者在不持有标的资产价格的情况下卖出看涨期权&#xff0c;那么这种策略就是卖出无备兑看涨期权策略。这个策略潜在盈利有限&#xff0c;但是亏损无限。 卖出看涨期…

基于SSM的应急资源管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Git - Git Merge VS Git Rebase

文章目录 概述Flow View小结 概述 Git merge和Git rebase是两种不同的版本控制工作流程&#xff0c;它们用于将一个分支的更改合并到另一个分支。它们有不同的工作原理和应用场景&#xff0c;下面是它们的主要区别&#xff1a; 合并的方式&#xff1a; Git Merge&#xff1a;合…

MySQL间隙锁深入分析

概念 什么是间隙锁&#xff1f; MySQL的间隙锁&#xff08;gap lock&#xff09;是一种锁定相邻数据间隔的机制。 触发时机&#xff1f; 当使用SELECT…FOR UPDATE或UPDATE语句时&#xff0c;MySQL会获取一个范围锁&#xff0c;包括指定条件内的所有数据行&#xff0c;并且还…

离散数学 学习 之 一阶逻辑基本概念 (一 )

个体词可以 理解为主语 &#xff0c; 3 不是偶数 &#xff0c;3 就是 个体常项 凡整数都能被 2 整除 &#xff0c; 整数就是 个体变项 上面的谓词是 &#xff08; 1 &#xff09; 是无理数 &#xff08; 2 &#xff09; 是有理数 &#xff08; 3 &#xff09; 与 同岁 &#xf…

四川百幕晟科技:提升店铺质量方法是什么?

抖店是抖音旗下的移动电子商务平台&#xff0c;为商家提供在线销售和促销的机会。在抖店&#xff0c;经验值是商家评价和信誉的重要指标之一。反映了平台上商户的服务质量和用户满意度。那么&#xff0c;如何查看自己在抖店手机上的体验分数呢&#xff1f; 1、如何查看抖店手机…

C# 随机数生成 Mersenne Twister 马特赛特旋转演算法 梅森旋转算法

NuGet安装MathNet.Numerics 引用: using MathNet.Numerics.Random; /// <summary>/// 包括lower&#xff0c;不包括upper/// </summary>/// <param name"lower"></param>/// <param name"upper"></param>/// <para…

老师如何私发成绩?

尊敬的各位老师&#xff0c;大家好&#xff01;你是否曾经为繁琐的成绩管理和与学生家长的沟通而感到头疼&#xff1f;是否希望有一个简单方便的工具&#xff0c;能够帮助你私发成绩、管理班级和与家长交流&#xff1f;那么&#xff0c;易查分将是你的最佳选择&#xff01;易查…

destoon根据标题删除重复数据

因为采集数据比较庞大&#xff0c;难免出现重复数据&#xff0c;所以写了一个根据标题进行删除重复数据的mysql命令&#xff0c;需要的朋友可以使用。 DELETE from destoon_article_36 where title in (SELECT * from (SELECT title FROM destoon_article_36 GROUP BY title …

想要精通算法和SQL的成长之路 - 受限条件下可到达节点的数目

想要精通算法和SQL的成长之路 - 受限条件下可到达节点的数目 前言一. 相交链表&#xff08;邻接图和DFS&#xff09; 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 相交链表&#xff08;邻接图和DFS&#xff09; 原题链接 public int reachableNodes(int n, int[][] ed…

超强干货,Pytest自动化测试框架fixture固件使用,0-1精通实战

前言 如果有以下场景&#xff1a;用例 1 需要先登录&#xff0c;用例 2 不需要登录&#xff0c;用例 3 需要先登录。很显然无法用 setup 和 teardown 来实现了 fixture 可以让我们自定义测试用例的前置条件 fixture 的优势 命名方式灵活&#xff0c;不局限于 setup 和teard…

黑马JVM总结(七)

&#xff08;1&#xff09;StringTable_编译器优化 “a”“b”对应#4&#xff1a;是去常量池中找ab的这个符号 astore 5&#xff1a;是把这个存入编号为5的局部变量 “ab”对应的指令 #4&#xff0c;跟“a”“b”对应#4下面弄是一样的 在执行s3“ab”这行个代码时&#xf…

【Python】从入门到上头—mysql数据库操作模块mysql-connector和PyMySQL应用场景 (15)

mysql-connector MySQL官方提供了mysql-connector-python驱动 安装驱动 python -m pip install mysql-connector连接数据库获取连接 import mysql.connectordb mysql.connector.connect(host"localhost", #ipuser"root", #用户名passwd"root",…

Python的命令行参数

Python的命令行参数&#xff0c;提供了很多有用的功能&#xff0c;可以方便调试和运行&#xff0c;通过man python就能查看&#xff0c;以下是一些常用参数使用实例和场景: 1. -B参数 在import时候&#xff0c;不产生pyc或者pyo文件: 比如有程序main.py如下: from Hello im…

SSM - Springboot - MyBatis-Plus 全栈体系(七)

第二章 SpringFramework 四、SpringIoC 实践和应用 3. 基于 注解 方式管理 Bean 3.4 实验四&#xff1a;Bean 属性赋值&#xff1a;基本类型属性赋值&#xff08;DI&#xff09; Value 通常用于注入外部化属性 3.4.1 声明外部配置 application.properties catalog.nameM…

UG\NX二次开发 获取装配部件的相关信息UF_ASSEM_ask_component_data

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 获取装配部件的相关信息UF_ASSEM_ask_component_data 包括:零件名称、引用集名称、实例名称、组件的位置、坐标系矩阵、转换矩阵。 效果: 代…

Docker基础学习

Docker 学习目标&#xff1a; 掌握Docker基础知识&#xff0c;能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用的安装 掌握docker迁移与备份相关命令 能够运用Dockerfile编写创建容器的脚本 能够…

并联电容器交流耐压试验方法

对被试并联电容器两极进行充分放电。 检查电容器外观、 污秽等情况, 判断电容器是否满足试验要求状态。 用端接线将并联电容器两极短接连接湖北众拓高试工频耐压装置高压端, 外壳接地。 接线完成后经检查确认无误, 人员退出试验范围。 接入符合测试设备的工作电源&#xff0c;…