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.rhkb.cn/news/371375.html

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

相关文章

Sequelize 操作 MySQL 数据库

安装 npm install --save sequelize安装驱动程序&#xff1a; npm install --save mysql2连接到数据库 要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成&#xff1a; const {Sequelize} re…

【C++知识点总结全系列 (06)】:STL六大组件详细总结与分析- 配置器、容器、迭代器、适配器、算法和仿函数

STL六大组件目录 前言1、配置器(1)What(2)Why(3)HowA.调用new和delete实现内存分配与销毁B.STL Allocator (4)allocator类A.WhatB.HowC.allocator的算法 2、容器(1)What(2)Which&#xff08;有哪些容器&#xff09;(3)序列容器&#xff08;顺序容器&#xff09;A.WhichB.array&…

Vue+Xterm.js+WebSocket+JSch实现Web Shell终端

一、需求 在系统中使用Web Shell连接集群的登录节点 二、实现 前端使用Vue&#xff0c;WebSocket实现前后端通信&#xff0c;后端使用JSch ssh通讯包。 1. 前端核心代码 <template><div class"shell-container"><div id"shell"/>&l…

web缓存代理服务器

一、web缓存代理 web代理的工作机制 代理服务器是一个位于客户端和原始&#xff08;资源&#xff09;服务器之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并指定目标原始服务器&#xff0c;然后代理服务器向原始…

【NTN 卫星通信】Starlink基于终端用户的测量以及测试概述

1 概述 收集了一些starlink的资料&#xff0c;是基于终端侧部署在野外的一些测试以及测量结果。 2 低地球轨道卫星网络概述 低地球轨道卫星网络(lsn)被认为是即将到来的6G中真正实现全球覆盖的关键基础设施。本文介绍了我们对Starlink端到端网络特征的初步测量结果和观测结果&…

win11自动删除文件的问题,安全中心提示

win11自动删除文件的问题&#xff0c;解决方法&#xff1a; 1.点击任务栏上的开始图标&#xff0c;在显示的应用中&#xff0c;点击打开设置。 或者点击电脑右下角的开始也可以 2.点击设置。也可以按Wini打开设置窗口。 3.左侧点击隐私和安全性&#xff0c;右侧点击Windows安全…

尚品汇-(十四)

&#xff08;1&#xff09;提交git 商品后台管理到此已经完成&#xff0c;我们可以把项目提交到公共的环境&#xff0c;原来使用svn&#xff0c;现在使用git 首先在本地创建ssh key&#xff1b; 命令&#xff1a;ssh-keygen -t rsa -C "your_emailyouremail.com" I…

【SVN的使用-源代码管理工具-命令行的使用 Objective-C语言】

一、接下来,我们来说一个终端的命令行的使用, 1.我们说,你的电脑里边呢,有终端, 在Mac里边,你想新建一个txt,应该怎么写,对,打开文本编辑, 打开这个东西,写点儿东西,然后保存一下,保存的时候,你还要去选择格式, 现在,如果我们用命令行,可以更方便一些, 2.首…

数据结构(其一)--基础知识篇

1. 数据结构三要素 1.1 数据结构的运算 即&#xff0c;增删改查 1.2 数据结构的存储结构 2. 数据类型&#xff0c;抽象数据类型 数据类型&#xff1a; &#xff08;1&#xff09;. 原子类型&#xff1a;bool、int... &#xff08;2&#xff09;. 结构类型&#xff1a;类、…

【vue组件库搭建06】组件库构建及npm发包

一、格式化目录结构 根据以下图片搭建组件库目录 index.js作为入口文件&#xff0c;将所有组件引入&#xff0c;并注册组件名称 import { EButton } from "./Button"; export * from "./Button"; import { ECard } from "./Card"; export * fr…

ubuntu常用命令

常用命令 netstatpsps -auxps -eLf netstat netstat -tunlp这个命令用来显示网络连接、路由表和网络接口统计信息。 Proto (协议): 显示连接使用的协议&#xff0c;通常是 “tcp” 或 “udp”。 Recv-Q (接收队列): 表示接收缓冲区中未被进程读取的数据包数量。一般情况下&am…

qt6 通过http查询天气的实现

步骤如下&#xff1a; cmakelist 当中&#xff0c;增加如下配置 引入包 访问远端api 解析返回的数据 cmakelist 当中&#xff0c;增加如下配置&#xff0c;作用是引入Network库。 引入包 3、访问远端api void Form1::on_pushButton_clicked() {//根据URL(http://t.weather.…

【Linux】在线求助命令--help,man page , info page

我们知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢&#xff1f; 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论&#xff0c;如何将 CSDN 上的博客&#xff0c;拉取到本地&#xff0c;然后PicGo、Hexo、Github 等工具建立个人博客&#xff0c;环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

计算组的妙用!!页面权限控制

需求描述&#xff1a; 某些特殊的场景下&#xff0c;针对某页看板&#xff0c;需要进行数据权限卡控&#xff0c;但是又不能对全部的数据进行RLS处理&#xff0c;这种情况下可以利用计算组来解决这个需求。 实际场景 事实表包含产品维度和销售维度 两个维度属于同一公司下面的…

方向导数和梯度

方向导数和梯度 1 导数的回忆2 偏导数及其向量形式偏导数的几何意义偏导数的向量形式 3 方向导数向量形式几何意义方向导数和偏导的关系 4 梯度5 梯度下降算法 1 导数的回忆 导数的几何意义如图所示&#xff1a; 当 P 0 P_{0} P0​点不断接近 P P P时&#xff0c;导数如下定义…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Feign-未完成

Feign Java中如何实现接口调用&#xff1f;即如何发起http请求 前三种方式比较麻烦&#xff0c;在发起请求前&#xff0c;需要将Java对象进行序列化转为json格式的数据&#xff0c;才能发送&#xff0c;然后进行响应时&#xff0c;还需要把json数据进行反序列化成java对象。 …

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限&#xff0c;使我们拥有调用 aliyunAPI 的权限&#xff0c;之后会生成 AccessKeyID 和 AccessKey密码&#xff0c;后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来&#xff0c;否则后期无法查…

multisim中关于74ls192n和DSWPK开关仿真图分析(减法计数器)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…