在STL中,任何迭代器都必须实现increment和dereference功能,对于前者,常常用到前置式和后置式两种。它们的实现有所不同,也带来了效率上的不同。先来看一个实现范例:
#include<iostream>
using namespace std;
class INT
{
public:
INT(int i) : m_i(i) {};
INT& operator++()
{
++(this->m_i);
return *this;
}
const INT operator++(int)
{
INT temp = *this;
++(*this);
return temp;
}
INT& operator--()
{
--(this->m_i);
return *this;
}
const INT operator--(int)
{
INT temp = *this;
--(*this);
return temp;
}
int& operator*() const
{
return (int&)m_i;
}
private:
int m_i;
};
可以看到,后置的形式存在一个int类型参数,因为这是为了编译器能够区分前置和后置操作,当函数被调用时,编译器会传递一个0做为int参数的值给该函数。另外,从实现不难看到,前置的效率是要高于后置的,因为后置在实现的过程中需要构造临时对象并返回。还有一点值得主要的是它们的返回参数是不同的,前置是对自身操作,然后将自身返回。而后置返回的已经不是之前的对象。这带来的区别就是,前置可以对于返回的对象继续进行操作,而后置的如果继续进行操作,改变的是临时对象的状态,没有意义。
参考书籍:《STL源码剖析》