一直都知道这个事实,C++ primer上看到的,知道是底层代码实现造成的,但是不清楚代码长什么样,今天偶遇了
今天自己写迭代器的类,需要重载递增运算符,就需要写前缀版本和后缀版本,自己动手,更加透彻的明白了效率差别:
class iterator{
Node * pt;//私有数据是一个Node指针
public:
iterator():pt(0){}
iterator(Node * pn):pt(pn){}
//重载*运算符函数,实现迭代器的解引用功能
double operator*(){return pt->item;}
//重载++运算符
iterator operator++(int) // it++,后缀递增运算符
{
iterator tmp = *this;//先存住当前迭代器
pt = pt->next;
return tmp;
}
iterator operator++() //++it,前缀递增运算符
{
pt = pt->next;
return *this;
}
//重载==
bool operator==(const iterator & it)
{
if (it->item == pt->item)
return true;
return false;
}
//重载!=
bool operator!=(const iterator & it)
{
if (it->item == pt->item)
return false;
return true;
}
};
其中重载++运算符的部分是:
//重载++运算符
iterator operator++(int) // it++,后缀递增运算符
{
iterator tmp = *this;//先存住当前迭代器
pt = pt->next;
return tmp;
}
iterator operator++() //++it,前缀递增运算符
{
pt = pt->next;
return *this;
}
可以看到,前缀++少了一句代码,因为返回的是递增之后的自己嘛,所以无需保存递增前的自己。而后缀++返回的是递增前的自己,但是递增会改变自己,所以必须要先保存好自己才能递增,然后载返回递增前的自己。。。总之,就多一句代码,就是有效率的差别。这就是从底层代码扣区别的示例之一了。