C++初学者指南-5.标准库(第一部分)--迭代器

C++初学者指南-5.标准库(第一部分)–迭代器 Iterators

文章目录

  • C++初学者指南-5.标准库(第一部分)--迭代器 Iterators
    • 1.默认正向迭代器
    • 2.反向迭代器
    • 3.基于迭代器的循环
    • 4.示例:交换相邻的一对元素
    • 5.迭代器范围
    • 6.迭代器范围中的元素数量
    • 7. 总结:迭代器

  • 指向某个位置的对象
  • 可能指向一个可读的内存地址或对象
  • 以一种与数据布局无关的方式迭代容器元素
  • 也用于指定容器中的位置和范围(用于插入、删除等操作)

在接下来的章节中,符号 @name 将被用来表示一个迭代器对象/参数/返回值。请注意,@ 在C++中既不是允许的操作符,也没有其他意义。

1.默认正向迭代器

可从标准容器中获取
具有成员函数:

  • container.begin() → @第一个元素
  • container.end() → @最后一个元素之后

或者用独立的函数:(C++11)

  • std::begin(container) → @第一个元素
  • std::end(container) → @最后一个元素之后

迭代器指的是容器中的一个位置:

vector<int> v {1,2,3,4,5,6,7};
auto i = begin(v);  
auto e = end(v); 

执行示例代码
在这里插入图片描述
*i 获取在位置i处的元素

cout << *i;prints 1
cout << *(i+2);prints 3
cout << *e;未定义行为

结束迭代器仅用作位置指示器,不应该用来访问元素。

++i向结束位置前进一步(一个元素位置)
–i向开始位置后退一步(一个元素位置)
i += 2向结束位置前进两步(两个元素位置)
i -= 3向开始位置后退三步(三个元素位置)

在这里插入图片描述

2.反向迭代器

许多(但不是所有)标准容器中可获得
使用容器成员函数:

  • container.rbegin() → @最后一个元素
  • container.rend() → @第一个元素之前

或者用独立的函数:(C++11)

  • std::rbegin(container) → @最后一个元素
  • std::rend(container) → @第一个元素之前

反向迭代器指的是容器中的一个位置:

vector<int> v {1,2,3,4,5,6,7};
auto i = rbegin(v);  
auto e = rend(v); 

运行示例代码
在这里插入图片描述
*i 获取在位置i处的元素

cout << *i;prints 7
cout << *(i+2);prints 5
cout << *e;未定义行为

rend迭代器仅用于作为位置指示器,不应该用来访问元素。

++i向开始位置后退一步(一个元素位置)
–i向结束位置前进一步(一个元素位置)
i += 2向开始位置后退两步(两个元素位置)
i -= 3向结束位置前进三步(三个元素位置)

在这里插入图片描述
ri.base()从反向迭代器返回相应的普通(非反向)迭代器。
反向迭代器 = 正常位置 - 1
正常位置 = 反向迭代器 + 1

vector<int> v {1,2,3};
auto re = rbegin(v);
auto fw = re.base();

在这里插入图片描述
注意,当反向迭代器指向元素3的时候,它的普通迭代器的位置是元素3后面的位置即正向迭代器的 end()。

3.基于迭代器的循环

前向方向

  • 适用于所有标准序列容器
  • 可能存在越界访问错误
  • 繁琐
std::vector<int> v {1, 2, 3, 4, 5, 6};
for (auto i = begin(v); i != end(v); ++i) { cout << *i; }

反向方向

  • 适用于所有双向容器
  • 可能存在越界访问错误
  • 繁琐
std::vector<int> v {1, 2, 3, 4, 5, 6};
for (auto i = rbegin(v); i != rend(v); ++i) { cout << *i; }

4.示例:交换相邻的一对元素

void swap_adjacent_pairs (std::vector<int>& v) {if (v.size() < 2) return;for (auto i=begin(v), j=i+1, e=end(v); j < e; i+=2, j+=2) {std::swap(*i,*j);}
}vector<int> v {1,2,3,4,5,6};
swap_adjacent_pairs(v);

运行示例代码
在这里插入图片描述

5.迭代器范围

= p和q这对迭代器
在这里插入图片描述
范围末端迭代器 q 指向最后一个元素后面的位置(意思是迭代器范围对中的末端迭代器只是指示位置,此元素不包含在范围内)
在这里插入图片描述
用于指定元素范围

  • 从容器中删除元素
    std::vector v {1,2,3,4,5,6,7,8,9};
    v.erase(begin(v)+3, begin(v)+6);
    在这里插入图片描述
  • 向容器中插入元素
  • 分配给另一个容器
  • 由标准算法处理

6.迭代器范围中的元素数量

在这里插入图片描述
distance(@range_begin, @element_in_range) → 元素在范围内的个数
函数参考

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>  // std::distance
std::vector<int> v {0,1,2,3,4,5,6,7,8};
// size of subrange (as shown in image)
auto n = distance(begin(v)+2, begin(v)+7);  // int n = 5
// size of entire container
auto m = distance(begin(v), end(v));        // int m = 9
std::vector<int> w {4,5,1,9,8};
// get index of smallest element in w:
auto argmin = distance(begin(w), min_element(begin(w),end(w)) );  
// int argmin = 2

运行示例代码

避免在像 std::list 这样的非随机访问容器中使用迭代器的距离,因为运行时间将与输入范围的大小成正比!

7. 总结:迭代器

指向容器/内存中的位置:
在这里插入图片描述
不要对end()位置用解引用符 * 访问!
仅仅把end()当成特殊位置

相关内容
查看 C++ 反向迭代器的另一种方式

附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

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

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

相关文章

护网在即,知攻善防助力每一位安服仔~

前言 是不是已经有师傅进场了呢~ 是不是有安服&#x1f412;在值守呢~ 您是不是被网上眼花缭乱的常用应急响应工具而烦恼呢&#xff1f; 何以解忧&#xff1f;唯有知攻善防&#xff01; 创作起源&#xff1a; 驻场、护网等&#xff0c;有的客户现场只允许用客户机器&…

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫&#xff1a;Scrapy框架的全面解析 一、引言 在当今互联网的时代&#xff0c;数据是最重要的资源之一。为了获取这些数据&#xff0c;我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言&#xff0c;拥有许多用于网络爬虫的工具和库…

puppeteer 爬虫初探

1. puppeteer 和 puppeteer-core 安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器&#xff1b; 安装 puppeteer-core &#xff0c;不会安装 chrome, 若要程序打开浏览器运行时&#xff0c;需手动指定电脑系统安装的 chrome 浏览器路径&#xff1b; 2. puppeteer-core …

按键控制LED流水灯模式定时器时钟

目录 1.定时器 2. STC89C52定时器资源 3.定时器框图 4. 定时器工作模式 5.中断系统 1&#xff09;介绍 2&#xff09;流程图&#xff1a;​编辑 3&#xff09;STC89C52中断资源 4&#xff09;定时器和中断系统 5&#xff09;定时器的相关寄存器 6.按键控制LED流水灯模…

一个最简单的comsol斜坡稳定性分析例子——详细步骤

一个最简单的comsol斜坡稳定性分析例子——详细步骤 标准模型例子—详细步骤 线弹性模型下的地应力平衡预应力与预应变、土壤塑性和安全系数求解的辅助扫描

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

数学系C++(六七)

目录 * &指针与地址 void指针 指针可以等于&#xff1a; const 指向常量的指针 const int *px 常指针 int * const px 指向常量的常指针const 类型标识符 * const 指针名 指针加减&#xff1a; 指针恒等式 函数指针【待续】 指针型函数&#xff1a; 指向函数的…

大数据之路 读书笔记 Day4 数据同步

回顾&#xff1a; Day 3 总结了无限客户端的日志采集 大数据之路 读书笔记 Day 3Day 2总结了浏览器端的日志采集 大数据之路 读书笔记 Day 2 数据同步 阿里数据体系中的数据同步&#xff0c;主要指的是在不同的数据存储系统之间进行数据的传输与更新&#xff0c;以保证数据的一…

reactor和proactor模型

Reactor模型是非阻塞的同步IO模型。在主线程中也就是IO处理单元中&#xff0c;只负责监听文件描述符上是否有事件发生&#xff0c;有的话就立即将事件通知工作线程&#xff0c;将socket可读可写事件放入请求队列&#xff0c;交给工作线程处理。 总而言之就是主线程监听有事件发…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_3【二十二】

在前面的几期博文中有过解析去除apk中功能权限的反编译步骤。另外在以往博文中也列举了修改apk中选项功能权限的操作方法。今天以另外一款apk作为演示修改反编译去除软件功能限制的步骤。兴趣的友友可以参考其中的修改过程。 课程的目的是了解apk中各个文件的具体作用以及简单…

【密码学】什么是密码?什么是密码学?

一、密码的定义 根据《中华人民共和国密码法》对密码的定义如下&#xff1a; 密码是指采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务。 二、密码学的定义 密码学是研究编制密码和破译密码的技术科学。由定义可以知道密码学分为两个主要分支&#x…

69.WEB渗透测试-信息收集- WAF、框架组件识别(9)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;68.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;8&#xff09; 有无waf存在&am…

GESP C++一级真题

PDF图片1-7 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f64f;

DPDK源码分析之(1)libmbuf模块

DPDK源码分析之(1)libmbuf模块 Author&#xff1a;OnceDay Date&#xff1a;2024年7月2日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;源码分析_Once-Day的博客-CSDN博客 参考文档&#xff1a; DPDK downloadGetting Started Guide for Linux…

CGAL计算凸包(OSG进行可视化)

目录 一、什么是凸包 二、运行步骤 1、安装依赖项 2、编译osg库 3、运行代码 4、运行截图 一、什么是凸包 凸包是计算几何中的一个基本概念,用来描述一个点集的最小凸包围形。具体来说,给定一个点集,凸包是包含该点集的最小凸多边形或凸多面体。 二维凸包:在二维平面…

算法-常见数据结构设计

文章目录 1. 带有setAll功能的哈希表2. LRU缓存结构3. O(1)时间插入删除随机(去重)4. O(1)时间插入删除随机(不去重)5. 快速获取数据流中的中位数6. 最大频率栈7. 全O(1)结构8. LFU缓存结构 本节的内容比较难, 大多是leetcodeHard难度级别的题目 1. 带有setAll功能的哈希表 哈希…

js计算两个日期直接的间隔天,2018/12/14到2017/11/10有多少天

const startDate new Date(2017-11-10)const endDate new Date(2018-12-14)const diffTime Math.abs(endDate - startDate)const diffDays Math.ceil(diffTime / (1000 * 60 * 60 * 24))console.log(diffDays) // 输出天数差 人工智能学习网站 https://chat.xutongbao.top…

VSCode神仙插件——Codeium (AI编程助手)

1、安装&登录插件 安装过程中会让你登录Codeium账户&#xff0c;可以通过Google账户登录&#xff0c;或者可以注册一个Codeium账户&#xff08;如果没有弹出让你登录账户的界面&#xff0c;可以等安装结束后在右下角找到登录的地方&#xff09; 右下角显示如下图所示&#…

【ubuntu中关于驱动得问题】—— 如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动总结 前言 NVIDIA显卡驱动是用于支持和优化NVIDIA显卡在计算机系统中运行的关键软件组件。该驱动程序能…

【每日一练】python算数练习题(函数.随机.判断综合运用)

""" 幼儿园加减法练习题 答对点赞表情&#xff0c;答错炸弹表情 表情随机出现 如果全答对有大奖 """ import random df0 #定义答对函数 def dd():global dfdf10bq["&#x1f339;&#x1f339;&#x1f339;","&#x1f389;&…