迭代器的使用

JS有哪些迭代器,该如何使用? JavaScript迭代器详解:本文全面介绍了JavaScript中的迭代器机制,包括可迭代协议和迭代器协议的基本概念,以及数组、字符串、Map/Set等内置迭代器的使用方法。详细讲解了如何通过生成器函数创建迭代器、实现自定义迭代器,以及迭代器与展开运算符、解构赋值等特性的结合使用。文章还涵盖了ES2018引入的异步迭代器及其应用场景,并提供了map、filter等实用工具函数的迭代器实现。最后讨论了迭代器在性能优化方面的优势,特别是惰性求值在处理大型数据集时的重要性。 阅读详情

先看下面的例子:

vector 的元素刪除

話頭從 container 的元素刪除說起。jyhuang 觀察到「如果 vector 或 list
的最後一個元素符合刪除條件,程式會有問題」。他給我這樣一個片段:

template <typename T>
void print_elements(T elem) { cout << elem << " "; }

void (*pfi)(int) = print_elements; //
函式指標,做為 function object 用
...
int ia[7] = {0,1,2,3,4,5,6};
vector<int> ivec(ia, ia+7);
for_each(ivec.begin(), ivec.end(), pfi); // 0 1 2 3 4 5 6

for (vector<int>::iterator it = ivec.begin(); it != ivec.end(); it++) {
  if (*it % 2) //
把奇數去掉
    ivec.erase(it);
}
for_each(ivec.begin(), ivec.end(), pfi); // 0 2 4 6
正確!



如果把 array 和 vector 的初值改為:

int ia[8] = {0,1,2,3,4,5,6,7};
vector<int> ivec(ia, ia+8);


則上述程式會當掉。


●I don't think so...

我不相信 STL 會有這麼差勁的表現。所以多做了幾次測試如下。

(1) 把 array 和 vector 的初值改為:

int ia[7] = {0,1,2,3,4,5,7};
vector<int> ivec(ia, ia+7);


程式結果為 0 2 4 7。結果不對,但不會當掉。

(2) 把 array 和 vector 的初值改為:

int ia[7] = {0,1,3,5,7,9,7};
vector<int> ivec(ia, ia+7);


程式結果為 0 3 7 7。錯得離譜,但不會當掉。

(3) 把 array 和 vector 的初值改為:

int ia[7] = {0,2,4,6,0,4,7};
vector<int> ivec(ia, ia+7);


程式執行時會當掉。


我於是多做了一些觀察,然後知道,上述這些動作根本上是完全
不對的。第一個 sample 之執行結果正確,完全是湊巧。

問題不在「最後一個元素是否符合刪除條件」,而在對 iterator
特性的認識。當我們做了 ivec.erase(it) 動作,vector 便動態
減縮了一個元素(邏輯上,後繼元素向前遞補),而 it 不變。
之後 for 迴圈的第三部份述句要求 it++,造成 it 跳過了一個元素...。

看實例:

(1) 初值為 {0,1,2,3,4,5,6}

第一次迭代,發現是偶數: ★ 以下以 e 表示 end()
0 1 2 3 4 5 6 e
^

第二次迭代,發現是奇數:
0 1 2 3 4 5 6 e
  ^

於是將  '1'  刪除,vector 變成:
0 2 3 4 5 6 e
  ^

第三次迭代,發現是奇數(這時已發生錯誤,因為 '2' 被跳過,沒有檢查):
0 2 3 4 5 6 e
    ^

於是將 '3' 刪除,vector 變成:
0 2 4 5 6 e
    ^

第四次迭代,發現是奇數(這時已發生錯誤,因為 '4' 被跳過,沒有檢查):
0 2 4 5 6 e
      ^

於是將 '5' 刪除,vector 變成:
0 2 4 6 e
      ^

第五次迭代,發現 it == vec.end(),於是跳離迴圈:
0 2 4 6 e
        ^

此時 vector 剩餘 0 2 4 6,陰錯陽差地與正確結果吻合。


(2) 初值為 {0,2,4,6,0,4,7}

第一次迭代,發現是偶數: ★ 以下以 e 表示 end()
0 2 4 6 0 4 7 e
^

第二次迭代,發現是偶數:
0 2 4 6 0 4 7 e
  ^

第三次迭代,發現是偶數:
0 2 4 6 0 4 7 e
    ^

第四次迭代,發現是偶數:
0 2 4 6 0 4 7 e
      ^

第五次迭代,發現是偶數:
0 2 4 6 0 4 7 e
        ^

第六次迭代,發現是偶數:
0 2 4 6 0 4 7 e
          ^

第七次迭代,發現是奇數:
0 2 4 6 0 4 7 e
            ^

於是將 '7' 刪除,vector 變成:
0 2 4 6 0 4 e
            ^

第八次迭代,it 越過了 end(),造成越界錯誤。迴圈何時結束,未可知也:
0 2 4 6 0 4 e ? ? ? ? ? ?
              ^


我的結論:

iterator 只適用於在「不更動 container 佈局」的條件下,對 container 做巡訪動作。否則,對 iterator 的取值行為,直觀下極易誤用。

原创网址:http://jjhou.boolan.com/

深入解析Buck开关电源中的死区时间设计及其对系统性能的影响 本文深入解析了Buck开关电源中死区时间的设计原理及其对系统性能的关键影响。死区时间通过防止上下管同时导通来避免穿通电流,确保系统安全。文章详细探讨了其工作机制、设置时的效率与安全权衡,以及不当设置对效率、稳定性和EMI的连锁反应,并提供了基于实测的调试方法与实战案例。 阅读详情

相关推荐

SAP系统从ECC升级至S/4 HANA的实现路径及项目过程

从SAP ECC升级到 S/4 HANA,通常是一个复杂的转型过程,涉及到企业资源规划系统的全面现代化

saplakes的博客 2903

迭代器用法详解

迭代器实际上是一种用来遍历容器元素的数据类型(作用类似与C语言的指针)。从此就可以看出,迭代器与容器的密切联系。我们知道,一些容器(如vector)可以通过[ ]来访问容器元素,但这种方式并不普遍,因为大多数的容器并不是数组实现的,也就不能用[]来访问容器元素。因此C++中就需要一种更加普遍的工具来提高效率,这就是迭代器。迭代器是一种数据类型,一种变量。它也有几种类型,输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机迭代器。所以它支持++,--,>,=,

2301_78933228的博客 2950

Cadence学习之路(六)元器件封装绘制

使用Allegro PCB Designer绘制元器件封装

qq_46757048的博客 1万+

迭代器(iterator)看这篇就够了

迭代器很重要,是遍历线性数据结构(链表)的重要方法之一。迭代器仅仅是遍历输出语句!本身并没有任何排序等其他功能,在数据结构的二叉树中别认为迭代器输出二叉树是因为迭代器会排序,是因为排序二叉树本身有序,迭代器仅仅是按照排序二叉树本身的排序规则输出罢了。

若葉的博客 10万+

告别MATLAB环境!保姆级教程:用Application Compiler把你的GUI程序打包成独立exe(2020R版本实测)

本文详细介绍了如何使用MATLAB的Application Compiler工具将GUI程序打包成独立exe文件,特别针对2020R版本进行实测。从技术原理、配置详解到打包实战与问题排查,提供完整的解决方案,帮助开发者实现无需MATLAB环境的程序分发,提升工作效率。

weixin_30571465的博客 274

基于STM32的宠物智能照护嵌入式系统设计

嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

weixin_29155599的博客 293

C++中迭代器原理、失效和简单实现

目录 迭代器的使用 迭代器的种类 迭代器的失效 迭代器的实现 1.迭代器的使用 为了提高C++编程的效率,STL中提供了许多容器,包括vector、list、map、set等。有些容器例如vector可以通过脚标索引的方式访问容器里面的数据,但是大部分的容器不能使用这种方式,例如list、map、set。STL中每种容器在实现的时候设计了一个内嵌的ite...

weixin_30571465的博客 573

ArcGIS:景观指数和景观单元关联生成景观指数遥感图像

优快云@_养乐多_本文将记录,使用由 Fragstats V4.2 软件计算的景观指数和瓦片 tif 数据生成景观指数图像的操作步骤。本教程的操作均在ArcGIS上进行,最后生成一个研究区内指定景观单元大小的景观指数图像。结果如下所示,

养乐多的博客 4931

Java迭代器(Iterator)详解及示例

Override@Override@Override输出OneTwoThree。

2301_80289515的博客 1388

Qt实现窗口等比例缩放

在Qt中,实现窗口的等比例缩放是一个常见的需求。通过对窗口的尺寸进行调整,使得窗口的内容在缩放过程中保持相同的比例,可以提供更好的用户体验。通过以上的代码,我们实现了一个可以等比例缩放的Qt窗口。在调整窗口大小时,窗口中的标签和按钮将按比例缩放,保持内容的比例不变。首先,我们需要在Qt中创建一个窗口,并设置其内容。在该事件中,我们将根据窗口的新尺寸计算出合适的比例因子,并将其应用到窗口的内容上。现在,我们将添加功能,使得窗口可以等比例缩放。最后,我们将缩放因子应用到窗口中的标签和按钮上,调整它们的尺寸。

2301_79330511的博客 3958

OpenSpec 完全指南 config.yaml文件

不管是项目内还是全局存放,自定义工作流都要遵守以下规则,否则会导致OpenSpec无法识别,新手一定要记牢:一个文件夹 = 一个工作流:工作流文件夹的名称,就是中schema字段要填写的名称;每个工作流文件夹必须包含:这是工作流的核心定义文件,没有它,OpenSpec无法识别这个工作流;模板文件统一放templates/目录:如果需要自定义生成文件的模板(比如统一的提案模板、任务模板),就放在工作流文件夹下的templates/里,OpenSpec会自动识别;

h a 6 6 6 c k 为 你解决复杂难题! 1419

迭代器 - 迭代器的概念及使用方法

迭代器是C++中用于遍历和操作容器中元素的重要工具。通过本文的介绍,读者应该能够理解迭代器的基本概念、类型以及使用方法。在实际编程中,合理使用迭代器可以大大提高代码的效率和可读性。希望本文对你理解和使用迭代器有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。

2301_81482480的博客 834

18、偏微分方程数值计算:粘性不可压缩流与电磁学的有限元方法

本文系统介绍了偏微分方程数值计算在粘性不可压缩流与电磁学中的应用,重点探讨了稳态与非稳态Navier-Stokes问题的混合有限元方法及求解技术,包括弱形式构建、半离散与时间离散格式、牛顿迭代法等。同时,详细阐述了电磁学中Maxwell方程的有限元与时域有限差分法(FDTD)求解方法,涵盖时间谐波与时域波方程、边界条件处理、稳定性分析与误差估计。结合MATLAB代码示例和实际案例,展示了速度场、压力、电场与磁场的数值模拟过程,并通过流程图与表格对比了两类问题的方法原理、应用场景与收敛性特性。最后展望了多物理

lemon的博客 88

【C++】迭代器的使用

在 C++ 中,迭代器是容器(如 vector、list、map 等)访问元素的一种通用方式,可以看作是指向容器中元素的指针。

qq_52208569的博客 1231

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中迭代器的使用

迭代器 1.概述: 帮助我们做集合遍历的工具。 2.作用: java中提供了很多种集合,它们在存储元素时,采用的存储方式不同。所以当我们要取出这些集合中的元素时,可以通过一种通用的获取方式来完成。 Collection集合元素的通用获取方式: 在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来;继续再判断,如果还有就再取出来。一直到把集合中的所有元素全部取出。这种取出方式专业术...

Korbin的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【JAVA】深入理解Java迭代器:迭代器的底层原理及使用场景

Java迭代器是用于遍历容器元素的工具,通过Iterator接口提供hasNext()、next()和remove()方法实现顺序访问。迭代器内部通过指针移动实现遍历,而增强for循环是其语法糖,底层自动转换为迭代器操作。主要使用场景包括集合遍历、安全删除元素、自定义集合遍历等。迭代器模式解耦了遍历逻辑与集合实现,提供统一访问方式。remove()方法可安全删除当前元素,避免并发修改异常。增强for循环简化了迭代器使用,编译后仍基于迭代器实现。

2302_79323248的博客 2456

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

迭代器(使用)

首先获取集合中迭代器对象 集合名.iterator()其次用迭代器对象调用方法询问当前位置是否有元素 迭代器对象 . hasNext()最后获取当前位置的元素,同时将迭代器指向下一个元素 迭代器对象.next()javas.add("MySQL从入门到精通");javas.add("Oracle高级编程");javas.add("Java架构师之路");

tian789p的博客 177

Python关于迭代器的使用

迭代是一种重复获取数据集合中元素的过程,一次只获取一个元素,直到遍历完所有元素。在Python中,迭代通常用于遍历序列(如列表、元组)或任何可迭代对象。1.2 Python中的迭代机制Python的迭代机制依赖于两个特殊方法:__iter__和__next__。__iter__方法返回一个迭代器对象,而__next__方法则负责返回迭代器的下一个值。当没有更多的值可返回时,__next__会抛出StopIteration异常。这使得Python中的所有可迭代对象都可以被自然地用于for循环。

互联网架构小马的博客 1572

java 迭代器 优势_Java迭代器使用浅析

Java迭代器使用浅析时间:2017-08-04来源:华清远见JAVA学院今天要和大家分享的Java开发知识是Java迭代器使用。Java迭代器是什么?迭代器是遍历容器的一种常用方法,它屏蔽了容器的实现细节,无需暴露数据结构内部,就可以对容器进行遍历,迭代器本身也是一种设计模式,迭代是一种特殊的遍历方式Iterator在java中,迭代器接口Iterator定义了三种方法public i...

weixin_30545587的博客 357

java中迭代器如何使用_Java中设计与使用迭代器

1.迭代器设计 迭代器是一种模式,它可以使得对于序列类型的数据结构的遍 历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是 什么样子的。 一般的迭代器对外提供的接口有: [1]检查是否至序列末端; [2]返回当前的对象; [3]过渡到下一个对象。 我1.迭代器设计迭代器是一种模式,它可以使得对于序列类型的数据结构的遍 历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是 什么样子的。...

weixin_39756192的博客 177

list使用迭代器

list使用迭代器做remove,jdk1.7版本 public class Demo { public static void main(String[] args) throws Exception { List<String> list = new ArrayList<>(); list.add("123"); list.add("456"); list.add("789"); list.add("666"); Iterator

weixin_43549665的博客 1532
上一篇: C语言的字符串,'\0',NULL,有什么区别
下一篇: C++ pair 类定义在哪个头文件里
Web客栈
博客等级 码龄18年 23粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值