他山之石,可以攻玉。

http://blog.csdn.net/jxh_123/article/details/30793397?utm_source=tuicool&utm_medium=referral

重点:

1、迭代器iterator就是一种智能指针,它对原始指针进行了封装,并且提供一些等价于原始指针的操作,做到既方便又安全

2、迭代器是连接容器和算法的一种重要桥梁。

find函数的函数原型为:template<class _InIt,class _Ty> _InIt find(_InIt _First, _InIt _last, const _Ty & _val)

从find函数原型可以看出find函数是一个函数模板,函数的形参中前两个参数为_InIt,该参数是InputIterator的缩写,最后一个参数则是一个任意类型变量的引用。

我们在使用find函数时,传入的实参为find(vec.begin(),vec.end(),7)。

这样我们的形参迭代器就将算法find和容器vector联系起来了,从这个角度我们可以很容易理解为什么说迭代器是算法和容器的联系的桥梁了

原因:可以用派生类对象作为实参传递给以基类类型作为形参的函数,所以find函数中的vec.begin()作为实参,以输入迭代器类型作为形参,两者可以达到虚实相结合的目的而不会出错。

所以说,迭代器为各类算法和和各类容器提供了一个相互沟通的平台。

致使迭代器失效的操作:

一、使vector迭代器失效的操作

分析:vector是一个动态数组,push_back后,其后都后移一位,导致指向其后元素的迭代器失效;

     C++为vector预分配一部分空间,如果插入操作导致空间不够用,就另外申请一个大的空间(一般为原有空间的2倍),并将原有元素赋值到新空间,销毁就空间。

1.向vector容器内添加元素(push_back,insert)

向vector容器添加元素分以下两种情况:

1)若向vector添加元素后,整个vector重新加载(即重新申请空间),即前后两次vector的capacity()的返回值不同时,此时该容器 内的所有元素对应的迭代器都将失效。

2)若该添加操作不会导致整个vector容器加载,则指向新插入元素后面的那些元素的迭代器都将失效。

2,删除操作(erase,pop_back,clear)

vector执行删除操作后,被删除元素对应的迭代器以及其后面元素对应的迭代器都将失效。

3.resize操作:调整当前容器的size

调整容器大小对迭代器的影响分如下情况讨论:

A.若调整后size>capacity,则会引起整个容器重新加载,整个容器的迭代器都将失效

B.若调整后size<capacity,则不会重新加载,具体情况如下:

B1.若调整后容器的size>调整前容器的size,则原来vector的所有迭代器都不会失效

B2.若调整后容器的size<调整前容器的size,则容器中那些被切掉的元素对应的迭代器都将失效

4.赋值操作(v1=v2     v1.assign(v2))

会导致操作数v1的所有迭代器都失效,显然操作数v2的迭代器都不会失效

5.交换操作(v1.swap(v2))

由于在做交换操作时,v1,v2均不会删除或插入元素,所以容器内不会移动任何元素,故v1,v2的所有迭代器都不会失效

二、 使deque迭代器失效的操作

分析:deque是双端数组,头尾插入是向外延伸,中间元素不变。使用insert在内部插入,会导致迭代器失效。

1.插入操作(push_front,push_back,insert)

deque的插入操作对迭代器的影响分两种情况:

A.在deque容器首部或尾部插入元素不会是任何迭代器失效;

B.在除去首尾的其他位置插入元素会使该容器的所有迭代器失效。

2.删除操作

A.在deque首、尾删除元素只会使被删除元素对应的迭代器失效;

B.在其他任何位置的删除操作都会使得整个迭代器失效。

三、使list/map/set迭代器失效的操作

由于list/map/set容器内的元素都是通过指针连接的,list实现的数据结构是双向链表,而map/set实现的数据结构是红黑树,故这些容器的插入和删除操作都只需更改指针的指向,不会移动容器内的元素,故在容器内增加元素时,不会使任何迭代器失效

  而在删除元素时,仅仅会使得指向被删除的迭代器失效

使用map时注意:STL中map这种关联容器的erase函数返回为void,不像顺序容器,返回删除元素的下一个元素

if(*it == value)
map.erase(it++); //利用后置++的性质
else
++it;

i++返回值是一个临时变量,重载时参数使用一个哑元int,以与++i分开,达到重载的目的;

成员函数法(隐含this指针):后置++重载

int operator++(int)
{
int tem = *this;
++*this;
rerurn tem;
}

对于顺序容器可以:

if(*it == value)
it = vector.erase(it); //顺序容器删除操作,返回删除元素的下一个元素的迭代器位置
else
++it;

5_STL设计理念_迭代器的更多相关文章

  1. day18_文件处理_迭代器_生成器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ********************day18_文件处理_迭代器_生成器 ************** ...

  2. cb07a_c++_迭代器和迭代器的范围

    cb07a_c++_迭代器和迭代器的范围c++primer第4版https://www.cnblogs.com/txwtech/p/12309989.html--每一种容器都有自己的迭代器--所有的迭 ...

  3. 4_STL设计理念_算法

    STL算法,容器,迭代器的设计理念1.STL容器通过 类模板 技术,实现 数据类型 和 容器模型的分离:2.迭代器技术 实现了 遍历和操作容器的统一方法3.STL算法设计理念:通过预定义的函数对象和函 ...

  4. python基础15下_迭代器_生成器

    print(dir([])) #告诉我列表拥有的所有方法 # 双下方法 # print([1].__add__([2])) print([1]+[2]) ret = set(dir([]))& ...

  5. java_设计模式_迭代器模式_Iterator Pattern(2016-08-12)

    迭代子(Iterator)模式又叫游标(Cursor)模式,是对象的行为模式. 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 如果要问java中 ...

  6. python语法_列表生成器_生成器_迭代器_异常捕获

    列表生成式 a = [x for x in range(10)] print(a) x 可进行操作 a = [x*2 for x in range(10)] print(a) x甚至可以为函数, de ...

  7. python基础15上_迭代器_生成器

    # 迭代器和生成器 # 迭代器: # 双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的 # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir ...

  8. Python基础(8)_迭代器、生成器、列表解析

    一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...

  9. Python笔记(二十八)_魔法方法_迭代器

    迭代器用于遍历容器中的数据,但它不是容器,它是一个实现了__next__方法的对象 与迭代器相关的内置函数: iter(): 将一个对象转换成一个迭代器 next(): 访问迭代器中的下一个变量,直到 ...

随机推荐

  1. 587A

    #include<iostream> #include<algorithm> #include<stdio.h> #include<stdlib.h> ...

  2. LoadRunner 12.02 安装以及汉化教程

    LoadRunner 12.02 安装 一.下载 首先下载Loadrunner12安装包. 下载后有四个安装包: HP_LoadRunner_12.02_Community_Edition_Addit ...

  3. position之absolute与relative 详解

    absolute:绝对定位: relative:相对定位: 唉,以前只是知是知道这两个单词的汉语意思,然后呢,,,怎么用...也是摸凌两可的用.终于抽出时间来看看了: 1.绝对定位:absulute ...

  4. position-relative 的问题

    对100%宽度的元素0001添加position-relative属性,如果再给left/right属性,可能会导致0001元素超出其父盒子的范围.如果盒子0001的父级元素是body,可能会出现滚动 ...

  5. 静态成员函数(面向对象的static关键字)

    静态成员函数 与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是某一个类的具体对象服务.静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分.普通的成员函数一般 ...

  6. Js+XML 操作

    xml文件Login.xml如下. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <L ...

  7. Java在ACM中的应用

    Java在ACM中的应用 —. 在java中的基本头文件(java中叫包) import java.io.*; import java.util.*; //输入Scanner import java. ...

  8. webvnc利器-noVNC集成实战

    我们在做一个虚拟机管理平台,底层虚拟化使用KVM,我们希望在网页上操作虚拟机. 一开始用applet嵌在网页内实现webvnc,不过由于applet的在浏览器上运行安全性限制,我们需要一个新的方案.此 ...

  9. HTML <!DOCTYPE> 标签

    在默认情况下,FF和IE的解释标准是不一样的,也就是说,如果一个网页没有声明DOCTYPE,它就会以默认的DOCTYPE解释下面的HTML.在同 一种标准下,不同浏览器的解释模型都有所差异,在默认情况 ...

  10. Codeforces 629C Famil Door and Brackets(DP)

    题目大概说给一个长m的括号序列s,要在其前面和后面添加括号使其变为合法的长度n的括号序列,p+s+q,问有几种方式.(合法的括号序列当且仅当左括号总数等于右括号总数且任何一个前缀左括号数大于等于右括号 ...