C++笔记之尾后迭代器

C++笔记之尾后迭代器

在这里插入图片描述
code review!
参考笔记
1.C++笔记之尾后迭代器
2.C++笔记之迭代器失效问题处理

在C++中,尾后迭代器(通常称为 past-the-end iterator)是指指向容器中最后一个元素之后的位置的迭代器。它并不指向任何有效的元素,而是用来表示容器的结束边界。尾后迭代器通常通过容器的 end() 成员函数获取。

文章目录

  • C++笔记之尾后迭代器
    • 尾后迭代器的作用
    • 使用尾后迭代器遍历容器
    • 尾后迭代器与反向迭代器的区别
    • 常见的误区与注意事项
    • 尾后迭代器与标准库算法

尾后迭代器的作用

  1. 边界标识:尾后迭代器用于标识容器的结束位置,常与起始迭代器(begin())一起用于遍历容器。
  2. 范围表示:在标准库算法中,尾后迭代器通常作为范围的结束参数,表示遍历的结束。
  3. 安全性:避免直接访问容器的非法内存位置,提高代码的安全性。

使用尾后迭代器遍历容器

以下是一个使用尾后迭代器遍历 std::vector 的示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用尾后迭代器遍历容器
    for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

1 2 3 4 5 

在这个示例中,vec.end() 返回一个尾后迭代器,it != vec.end() 用于判断是否已经遍历到容器的末尾。

尾后迭代器与反向迭代器的区别

需要注意的是,尾后迭代器反向迭代器reverse_iterator)是不同的概念:

  • 尾后迭代器 (end()) 指向容器的最后一个元素之后的位置,通常用于正向遍历。
  • 反向迭代器 (rbegin()rend()) 用于反向遍历容器,rend() 相当于尾后迭代器,但在反向遍历的语境下。

示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用反向迭代器遍历容器
    for (std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {
        std::cout << *rit << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

5 4 3 2 1 

常见的误区与注意事项

  1. 解引用尾后迭代器:尾后迭代器不指向任何有效的元素,解引用它会导致未定义行为。

    std::vector<int>::iterator it = vec.end();
    // 错误:不应解引用尾后迭代器
    // std::cout << *it;
    
  2. 迭代器失效:在对容器进行修改(如添加或删除元素)后,尾后迭代器可能会失效,使用前应确保迭代器的有效性。

  3. 混淆反向迭代器和尾后迭代器:反向迭代器是基于尾后迭代器实现的,但它们有不同的行为和用途,需根据需求选择正确的迭代器类型。

尾后迭代器与标准库算法

许多标准库算法使用尾后迭代器来定义操作范围。例如,std::find 的用法:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};
    int target = 30;

    // 使用尾后迭代器作为范围
    auto it = std::find(vec.begin(), vec.end(), target);

    if (it != vec.end()) {
        std::cout << "找到目标元素,值为:" << *it << std::endl;
    } else {
        std::cout << "未找到目标元素。" << std::endl;
    }

    return 0;
}

输出:

找到目标元素,值为:30

在这个例子中,std::find 会在 [vec.begin(), vec.end()) 的范围内查找目标元素,vec.end() 作为尾后迭代器标识搜索的结束。

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

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

相关文章

Gibbs现象(Gibbs Phenomenon)最初数学上的定义

Gibbs现象&#xff08;Gibbs Phenomenon&#xff09;是在处理周期性信号的傅里叶级数展开时出现的一种现象。当一个周期函数在不连续点附近被其傅里叶级数的部分和近似时&#xff0c;近似值会在不连续点处产生过冲&#xff08;overshoot&#xff09;和欠冲&#xff08;undersho…

【时时三省】(C语言基础)动态内存函数realloc

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 realloc realloc函数的出现让动态内存管理更加灵活。 有时会我们发现过去申请的空间太小了&#xff0c;有时候我们又会觉得申请的空间过大了&#xff0c;那为了合理的时候内存&#xff0c;…

pycharm+anaconda创建项目

pycharmanaconda创建项目 安装&#xff1a; Windows下PythonPyCharm的安装步骤及PyCharm的使用-CSDN博客 详细Anaconda安装配置环境创建教程-CSDN博客 创建项目&#xff1a; 开始尝试新建一个项目吧&#xff01; 选择好项目建设的文件夹 我的项目命名为&#xff1a;pyth…

ActiveMQ支持哪些传输协议

ActiveMQ 支持多种传输协议&#xff0c;以满足不同场景下的需求。这些协议包括但不限于以下几种&#xff1a; 1. OpenWire&#xff1a; • 这是 ActiveMQ 的默认和专有协议。 • 提供了高效、可靠的消息传递功能。 • 支持多种消息传递模式&#xff0c;如点对点和发布/订阅。 2…

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

第9章图9.15-9.21-《分析模式》原图和UML图对比

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集

提升口语发音水平,中英文发音评测系统实现

在全球化的浪潮中&#xff0c;语言不再是障碍&#xff0c;而是连接世界的桥梁。掌握一门流利的英语&#xff0c;意味着打开了通往世界的大门。但是&#xff0c;如何确保你的英语口语如同母语者一样自然流畅&#xff1f;这正是我们存在的意义。 我们的中英文口语发音评测服务&a…

C语言初阶习题【20】扫雷游戏

1.用C语言实现扫雷游戏 本博客和三子棋游戏比较大的区别是&#xff0c;三子棋游戏是写完了再总结的&#xff0c;本博客是边代码实现边编辑博客&#xff0c;所以本博客会比较详细的po出每一步骤&#xff0c;在每实现一个小功能的时候我们都先验证下效果&#xff0c;再继续下一步…

Python AI教程之七:多项式回归

多项式回归的实现 多项式回归是一种线性回归,其中独立变量 x 和因变量 y 之间的关系被建模为n 次多项式。多项式回归拟合 x 的值与 y 的相应条件均值之间的非线性关系,表示为 E(y | x)。在本文中,我们将深入探讨多项式回归。 目录 什么是多项式回归? 为什么采用多项式回归…

【Leetcode】3280. 将日期转换为二进制表示

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个字符串 date&#xff0c;它的格式为 yyyy-mm-dd&#xff0c;表示一个公历日期。 date 可以重写为二进制表示&#xff0c;只需要将年、月、日分别转换为对应的二进制表示&a…

网段划分和 IP 地址

1. IP 协议 IP 协议是网络层协议&#xff0c;主要负责在不同网络设备之间&#xff0c;进行数据包的地址分配和路由选择。 地址分配&#xff1a;为每个连接到公网的设备分配一个唯一的 IP 地址&#xff0c;确保数据能被准确地发送到目标设备。 数据分片和组装&#xff1a;当发…

【Python系列】Python 中对对象列表进行排序

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

微服务のGeteWay

目录 概念&#xff1a; 三大核心&#xff1a; 工作流程&#xff1a; 9527网关如何做路由映射&#xff1a; GetWay高级特性&#xff1a; 按服务名动态路由服务&#xff1a; 断言Route Predicate Factories &#xff1a; 获取当前时区时间&#xff1a; After Route &…

数字图像处理 三 空间滤波

空间滤波是一种图像处理技术&#xff0c;它通过对图像像素及其邻域进行运算&#xff0c;利用均值&#xff0c;高斯&#xff0c;梯度&#xff0c;拉普拉斯等线性滤波和中值&#xff0c;最大最小&#xff0c;双边滤波等非线性滤波改变像素值&#xff0c;实现图像的平滑&#xff0…

【CVE-2024-12987 】DrayTek 网关设备中 `apmcfgupload` 端点的命令注入漏洞

概述 DrayTek 网关设备(包括 Vigor2960 和 Vigor300B 型号)存在通过 Web 管理接口进行命令注入的漏洞。攻击者可以通过发送恶意的 HTTP 请求到 /cgi-bin/mainfunction.cgi/apmcfgupload 端点,利用该漏洞注入任意命令,从而影响超过 66,000 台连接到互联网的设备。 受影响的…

mac下载Homebrew安装nvm

通过Homebrew安装 - 国内下载地址 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装nvm brew install nvm 配置nvm环境变量 export NVM_DIR“$HOME/.nvm” [ -s “/usr/local/opt/nvm/nvm.sh” ] && . “/usr/…

[react] 纯组件优化子

有组件如下,上面变化秒数, 下面是大量计算的子组件,上面每一秒钟变化一次,这时候子组件会不断重新渲染, 浪费资源 父组件如下 import React, { memo, useEffect, useMemo, useState } from react; import type { ReactNode, FC } from react; import HugeCount from ./Te; int…

Unity Mesh生成Cube

1. 配置一个Cube的每个面的数据 一共是6个面&#xff0c;每个面包含的数据包括4个顶点的相对顶点坐标&#xff08;Cube的中心为原点&#xff09;&#xff0c;法线方向&#xff0c;UV坐标&#xff0c;顶点渲染顺序&#xff0c;以及这个面用到的材质&#xff0c;因为这里是Top&am…

Spring--三级缓存机制

一、什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形态的三个Map集合&#xff0c;如下&#xff1a; // 一级缓存Map 存放完整的Bean&#xff08;流程跑完的&#xff09; private final Map<String, Object> singletonObjects new ConcurrentHashMap(256);// 二…