一   引出迭代器:
了解容器list ,就应该先会用容器list.首先我们要知道list,其实就是一个用模板实现的双向带头循环列表。

肯定会有同学有疑问,那既然是个双向带头循环链表,那为什莫要用STL中容器list,

#pragma once
#include<iostream>
using namespace std;
#include<list>
void test_list()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);}
看上面这段代码:list它有和之前博客中写到的链表可以完成push_pack这个功能,那它的优点何在?
请思考比如你要打印这些插入的结点,之前的双向循环链表你写一个print()函数就可以,遍历一遍链表就可以。可是这就有很大的问题,你必须知道头结点,不然你怎么遍历,怎么结束呢?但是这就出现了以下缺点:
1.破坏封装   2.增加使用成本
因此在vector中引入了迭代器,用迭代器来访问容器vector的数据
迭代器:(iterator)可在容器上遍访的接口,设计人员无需关心容器物件的内容(减少使用成本)它可以把抽象的容器和通用算法有机的统一起来。迭代器是一种对象,它能够用来遍历标准模板库容器中的部分或全部成员。每个迭代器对象代表容器中的确定的地址。

二   迭代器分类:
#pragma once
#include<iostream>
using namespace std;
#include<list>
void test_list()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);void print_list(const list<int>& l);//void print_list1(list<int>& l);//list<int>::iterator it = l1.begin();//遍历链表//while (it != l1.end())//{//  cout << *it << " ";// it++;//}//cout << endl;///size_t n = 10;//如果有n个结点,打印n个。没有n个结点,全部打印//list<int>::iterator it = l1.begin();//while (it != l1.end() && n--)//{// cout << *it << " ";// it++;//}//cout << endl;////list<int>::reverse_iterator rit = l1.rbegin();//反向迭代器   打印出来是倒序的//while (rit != l1.rend())//{//  cout << *rit << " ";//    rit++;//}//cout << endl;//print_list(l1);//掉const迭代器//print_list1(l1);//掉普通迭代器
}
//void print_list1( list<int>& l) //最好传引用,不然深拷贝代价太大
//{
//  list<int>::iterator it = l.begin();//普通迭代器   可读可写
//  while (it != l.end())
//  {
//      if (*it % 2)
//      {
//          *it = *it * 2;
//          cout << *it << " ";
//      }
//      ++it;
//  }
//}
void print_list(const list<int>& l) //最好传引用,不然深拷贝代价太大
{list<int>::const_iterator it = l.begin();  //const迭代器  只能读不能写while (it != l.end()){if (*it % 2){//*it = *it * 2;  const类型不能改变值,只能访问cout << *it << " ";}++it;}
}
三     迭代器失效问题:
1.  看如下代码:
list<int>::iterator it = l1.begin();//本意是相删除所有偶数while (it != l1.end()){if (*it % 2){l1.erase(it);}cout << *it << " ";it++;}
看着代码也没有什么问题,但是程序崩溃了,原因就是出现了迭代器失效。
2.  如何解决呢?

其实容器list 里面erase()有一个返回值,返回的是指向下一个结点的迭代器

while (it != l1.end()){if (*it % 2){it=l1.erase(it);}else{cout << *it << " ";it++;}}

删除一个结点,让it接受下,也就是it现在是指向下个结点。

四   总结:1.传统双向链表中,print 是遍历全部打印 ,还要给出头结点 (破坏封装) ---------相当于打包--------不能改变结点
迭代器:可以改变结点,也可以打印部分结点
2.print如果访问,必须知道要访问的数据叫date,然后打印 . -------------增加使用成本
迭代器:不用管你是date,还是x .我*it  就行    

迭代器 ------------如何使用迭代器(list)相关推荐

  1. 迭代器和反向迭代器,常量迭代器和非常量迭代器

    迭代器的类型共有4种:<T>::Iiterator,<T>::const_iterator,<T>::reverse_iterator,<T>::con ...

  2. php迭代器作用,PHP迭代器介绍

    迭代器有一个简单且常见的接口: function Iterator($array) //构造函数.使需要遍历的数组作为一个参数 function reset() //设置内部指针指向第一个元素 fun ...

  3. python迭代器使用_python迭代器的使用方法实例

    什么是迭代器?迭代器是带有next方法的简单对象,当然也要实现__iter__函数.迭代器能在一序列的值上进行迭代,当没有可供迭代时,next方法就会引发StopIteration 的异常.pytho ...

  4. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

  5. 插入迭代器、流迭代器、反向迭代器、移动迭代器

    文章目录 前言 插入迭代器 inserter front_inserter back_inserter iostream迭代器 istream_iterator 读取输入流 istream_itera ...

  6. python迭代器好处_python迭代器

    知识内容: 1.可迭代对象和迭代器 2.判断迭代器和可迭代对象的方法 3.迭代器的优缺点 一.可迭代对象和迭代器 1.可迭代对象 -> Iterable (1)可迭代协议 可以被迭代要满足要求的 ...

  7. python生成器迭代器_python 生成器 迭代器

    阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...

  8. java集合迭代器_java集合迭代器

    一.Java中有一个设计模式是迭代器模式 1.迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.迭代器模式概述 Java集 ...

  9. java 迭代器失效_迭代器失效的几种情况

    关于迭代器失效,,今天做一个总结. 迭代器失效分三种情况考虑,也是三种数据结构考虑,分别为数组型,链表型,树型数据结构. 1.对于序列式容器,比如vector,删除当前的iterator会使后面所有元 ...

  10. Python 迭代器和 C++ 迭代器,最大的不同竟然是......

    作者 | 樱雨楼 责编 | 胡巍巍 前言 迭代器(Iterator)是 Python 以及其他各种编程语言中的一个非常常见且重要,但又充满着神秘感的概念.无论是 Python 的基础内置函数,还是各类 ...

最新文章

  1. python秩和检验(Kruskal-Wallis H Test)
  2. sql2008表结构查看_【赵强老师】Oracle数据库的存储结构
  3. 数据缺失、混乱、重复怎么办?最全数据清洗指南
  4. 【转载】ftp获取文件
  5. WebBrowser控件判断完全加载中DocumentCompleted和Navigated的关系
  6. 蓝桥杯 算法训练 数字三角形(最简单的DP)
  7. 【Python实现数据可视化】创建3D柱状图
  8. Spring + hibernate + JPA 配置
  9. C++ stringstream输入方式
  10. 加油站都需要什么手续_农村买房过户都需要什么手续?
  11. resset-rem.css
  12. 零基础学python尹会生_编程零基础应当如何开始学习 Python?
  13. HDU2222【AC自动机(基础·模板)】
  14. 9.凤凰架构:构建可靠的大型分布式系统 --- 可靠通信
  15. Javadoc注释的用法
  16. Xmind 8思维导图使用方法
  17. 如何学习plc编程?(核心秘诀分享)
  18. 单片机学习笔记(数码管)
  19. secureCRT显示中文
  20. php代码审计命令执行,PHP代码审计笔记--命令执行漏洞

热门文章

  1. 分水岭:知识的深度拓展
  2. UEditor 编辑器使用 最新版本1.4.3
  3. 物理机服务器重装nvidia显卡驱动
  4. 为什么火狐浏览器打开默认是hao123
  5. Sql Server 快捷键
  6. 一种有手就行的物联网平台的多终端接入方法
  7. Localhost无法加载图片是怎么回事?
  8. Theano的安装及GPU的配置
  9. 23.MongoDB地理位置检索
  10. uniapp里的mounted_uni-app自定义组件mounted无法获取节点信息