iterator 前++ 后++区别

for(iterator it = begin(); it != end(); ++it)  此处的 begin()《==》this->begin()
       或者
for(iterator it = begin(); it != end(); it++)
       区别是什么呢??

对于两种方式来说:
for(iterator it = begin(); it != end(); ++it)
{
    return it->second;
}
for(iterator it = begin(); it != end(); it++)
{
       return it->second;
}
每一次返回的结果是否相同??

两种方式iterator遍历的次数是相同的,但在STL中效率不同,前++返回引用,后++返回一个临时对象,因为iterator是类模板,使用
it++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对
象。
       可以去看看C++的标准库,还有符合标准C++的教材,除了特殊需要和对内置类型外,基本都是使用++it来进行元素遍历的,不管是源代码还是教材中都是如此。
       用户定义类型对操作符的重载应与内置操作符的行为相似,而且后自增/减往往是引用前自增/减来作为其实行的一个副本。
       比如通常都是这种形式:
class foo
{
public:
       foo& operator ++ (){return ++bar;}
       foo operator ++ (int)
       {
             foo tmp = *this; // 创建临时对象 ★
             ++*this; // 调用前自增
             return tmp; // 返回临时对象 ★
       }
private:
       int bar;
}
       以上标★号的2个步骤有时是多余的,比如用STL中用iterator遍历容器,这样就造成了不必要的程序效率的损失。这也是被一些从C移植到C++的程序员所频频忽视的细节,所以它们被称为从C带到C++中的编程恶习。

iterator 前++ 后++区别

时间: 2024-11-05 05:10:01

iterator 前++ 后++区别的相关文章

Hibernate面试题 --- list和iterator方法的区别

Hibernate面试题  ---  list和iterator方法的区别 1.首先看两个例子来比较一下 (1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出: 1 @Test 2 public void listQuery() { 3 4 Configuration configuration = new Configuration().configure(); 5 SessionFacto

获取当前日期前(后)x天的日期

package com.xcfh.util; import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;/** *  * @ClassName: BeforeOrAfterDate *  * @Description: 获得当前输入日期前(后)x天的日期 * @author PineTree * @date 2014年12月29

获得当前输入日期前(后)x天的日期

package com.xcfh.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * * @ClassName: BeforeOrAfterDate * * @Description: 获得当前输入日期前(后)x天的日期 * @author PineTree * @date 2014年12月

大杂烩 -- Iterator 和 Iterable 区别和联系

基础大杂烩 -- 目录 用Iterator模式实现遍历集合  Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构. 例如,如果没有使用Iterator,遍历一个数组的方法是使用索引: for(int i=0; i<array.size(); i++) { ... get(i) ... } 而访问一个链表(LinkedList)又必须使用while循环: while((e=e.next())!=null) { ...

Iterator 和 Iterable 区别和联系

用Iterator模式实现遍历集合  Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构. 例如,如果没有使用Iterator,遍历一个数组的方法是使用索引: for(int i=0; i<array.size(); i++) { ... get(i) ... } 而访问一个链表(LinkedList)又必须使用while循环: while((e=e.next())!=null) { ... e.data() ..

SQL执行并返回执行前/后结果

1.插入数据,并返回插入的数据: INSERT INTO TestTB(Province,City) output inserted.Province, inserted.City VALUES('广东','深圳') 2.同理,删除数据也是一样的,只不过是使用deleted表罢了. delete from TestTB output deleted.* where id=1 3.两个结合一起:返回更新前和更新后的数据: UPDATE TestTB SET Province = '湖南',City

Iterator和ListIterator区别

我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器).使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了. 但是在使用的时候也是有不同的.List和Set都有iterator()来取得其迭代器.对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面: 1. ListIterator有add()方法,可以向L

js获取指定字符前/后的字符串简单实例

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> </head> <script type="text/javascript"> /* string 字符串; str 指定字符; split(),用于把一个字符串分割成字符串数组; split(str)[0],读取数组中索引为

隐马尔可夫(HMM)、前/后向算法、Viterbi算法

HMM的模型  图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下图: 代表:c确定时a和b独立.(c为实心圆代表:c已经被确定) 这时,如果把z1看成a,x1看成b,z2看成c的话,则因为第一个图的z1是不可观测的(所以z1是空心圆),也就是没确定,则x1和z2就一定有联系. 进一步,如果把z2.x2合在一起看成c的话,则x1和z2.x2就一定有联系,则x1和x