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

news2024/9/19 10:43:08

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.coloradmin.cn/o/1904823.html

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

相关文章

Vue笔记11-Composition API的优势

Options API存在的问题 使用传统Options API中&#xff0c;新增或者修改一个需求&#xff0c;就需要分别在data&#xff0c;methods&#xff0c;computed里修改&#xff0c;而这些选项分布在代码的各个地方&#xff0c;中间还穿插着其他Optional API&#xff0c;如果代码量上来…

国产化新标杆:TiDB 助力广发银行新一代总账系统投产上线

随着全球金融市场的快速发展和数字化转型的深入推进&#xff0c;金融科技已成为推动银行业创新的核心力量。特别是在当前复杂多变的经济环境下&#xff0c;银行业务的高效运作和风险管理能力显得尤为重要。总账系统作为银行会计信息系统的核心&#xff0c;承载着记录、处理和汇…

运维锅总详解系统启动流程

本文详细介绍Linux及Windows系统启动流程&#xff0c;并分析了它们启动流程的异同以及造成这种异同的原因。希望本文对您理解系统的基本启动流程有所帮助&#xff01; 一、Linux系统启动流程 Linux 系统的启动流程可以分为几个主要阶段&#xff0c;从电源开启到用户登录。每个…

FPGA-UDP实验

1. 以太网简介 水晶头的规格就是RJ45千兆网一般指的就是UDP千兆网PHY芯片是用来协商用的 协商匹配最低的通信速率 1.1. OSI模型 7层 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin…

【LeetCode】有效的数独

目录 一、题目二、解法 一、题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…

使用OpenCV与PySide(PyQt)的视觉检测小项目练习

OpenCV 提供了丰富的图像处理和计算机视觉功能&#xff0c;可以实现各种复杂的图像处理任务&#xff0c;如目标检测、人脸识别、图像分割等。 PyQt(或PySide)是一个创建GUI应用程序的工具包&#xff0c;它是Python编程语言和Qt库的成功融合。Qt库是最强大的GUI库之一。Qt的快速…

昇思MindSpore 25天学习打卡营|day18

DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动漫头像数据集共有70,171张动漫头像图片&#xff0c;图片大小均为96*96。 GAN基础原理 这部分原…

06.C2W1.Auto-correct

往期文章请点这里 目录 OverviewAutocorrectWhat is autocorrect?How it works Building the modelMinimum edit distanceMinimum edit distance algorithmMinimum edit distance Part 2Minimum edit distance Part 3 往期文章请点 这里 Overview 本周学习目标&#xff1a;…

C++入门7——string类详解

目录 1.什么是string类&#xff1f; 2.string类对象的常见构造 2.1 string(); 2.2 string (const char* s); 2.3 string (const string& str); 2.4 string (const string& str, size_t pos, size_t len npos); 2.5 string (const char* s, size_t n); 2.7 验证…

Educational Codeforces Round 167 (Rated for Div. 2)(A~C)题解

A. Catch the Coin 解题思路: 最终&#x1d465;一定会相等&#xff0c;我们考虑直接到下面接住他。 #include<bits/stdc.h> using namespace std; typedef long long ll; #define N 1000005 ll dp[N], w[N], v[N], h[N]; ll dis[1005][1005]; ll a, b, c, n, m, t; ll…

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发&#xff08;2&#xff09;— 第一个简单驱动编写和测试 一、前言 教程参考&#xff1a;02_实战部分_PCIE设备测试 教程参考&#xff1a;03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示&#xff1a; #i…

芯片封装简介

1、背景 所谓“封装技术”是一种将集成电路用绝缘的塑料或陶瓷材料打包的技术。以CPU为例&#xff0c;实际看到的体积和外观并不是真正的CPU内核的大小和面貌&#xff0c;而是CPU内核等元件经过封装后的产品。封装技术对于芯片来说是必须的&#xff0c;也是至关重要的。因为芯片…

Java AI+若依框架项目开发 RuoYi-Vue(SpringBoot + Vue)

1.诺依的版本 本次选择RuoYI-Vue框架进行讲解 官网地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 (gitee.com) 2.搭建后端…

centos7|操作系统|低版本的OpenSSH升级到最新版本OpenSSH-9.8.p1

前言&#xff1a; 1、 OpenSSH是什么 OpenSSH 是 SSH &#xff08;Secure SHell&#xff09; 协议的免费开源实现。SSH协议族可以用来进行远程控制&#xff0c; 或在计算机之间传送文件。而实现此功能的传统方式&#xff0c;如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都…

集合复习(java)

文章目录 Collection 接口Collection结构图Collection接口中的方法Iterator 与 Iterable 接口Collection集合遍历方式迭代器遍历增强 for 遍历 List&#xff08;线性表&#xff09;List特有方法ArrayList&#xff08;可变数组&#xff09;ArrayList 底层原理ArrayList 底层原理…

土豆炒肉做法

菜单&#xff1a;土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程&#xff1a; 洗土豆&#xff0c;削皮&#xff0c;擦成条&#xff0c;用凉水过滤两遍淀粉&#xff0c;顺便放个燥里洗肉&#xff0c;切成条&#xff0c;按照生抽、酱油、淀粉、…

【Etabs】【Rhino】Swallow(ESD)软件的ETABS功能介绍

Swallow(ESD)软件的ETABS功能介绍 来源&#xff1a;https://www.food4rhino.com/app/swallowesd 文章目录 Swallow(ESD)软件的ETABS功能介绍1. Load模块1.1 Support节点支座1.2 LoadPattern荷载模式1.3 LoadPattByName引用模型荷载模式1.4 AutoWindChinese自动风荷载参数1.5 R…

【数据结构与算法】插入排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

Git仓库介绍

1. Github GitHub 本身是一个基于云端的代码托管平台&#xff0c;它提供的是远程服务&#xff0c;而不是一个可以安装在本地局域网的应用程序。因此&#xff0c;GitHub 不可以直接在本地局域网进行安装。 简介&#xff1a;GitHub是最流行的代码托管平台&#xff0c;提供了大量…

【开放集目标检测】Grounding DINO

一、引言 论文&#xff1a; Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 作者&#xff1a; IDEA 代码&#xff1a; Grounding DINO 注意&#xff1a; 该算法是在Swin Transformer、Deformable DETR、DINO基础上…