推测:
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{}
我确实理解了int
等内置类型的前/后增量的区别,但就迭代器而言,++iter
和{{1}之间的区别是什么}? (请记住,我知道两者在这里产生相同的结果)。
答案 0 :(得分:9)
++iter
最有可能更快,但绝不会慢于iter++
。
实现后增量运算符iter++
需要生成一个额外的临时值(在原始iter
递增++
时)返回此临时值而不是实现后增量运算符{{1因此,除非编译器可以优化(是的,它可以)后增量,否则++iter
很可能比++iter
更快。
鉴于上述情况,最好在循环条件下使用iter++
。
答案 1 :(得分:4)
它与整数相同。
对于预增量,iter递增,返回的对象与iter相同。
对于后增量,必须将iter复制到临时,然后增加iter,返回副本。但是,大多数编译器可以优化不使用此副本的事实,因此可以删除副本,使其与预增量相同。
对于那些不能这样做的编译器,后增量可能会导致性能略微降低,但通常情况不再如此。
答案 2 :(得分:3)
这完全取决于它们的实施方式。
但最常见的后增量实现方式是使用额外副本预增量。
class MyIter
{
// Definition of pre-increment:
// ++object;
MyIter& operator++()
{
/* Increment the iterator as appropriate
You should be changing the object in place
*/
// Once you are done return yourself.
return *this;
}
// Definition of post-increment:
// object++;
MyIter operator++(int)
{
// Post increment (returns the same value) so build the result.
MyIter result(*this);
// Now do the increment using pre-increment on the current object
++(*this);
// return the result.
return result;
}
};
因此,后增量的标准实现调用预增量,另外还会生成对象的副本。请注意,返回时还有一个额外的复制结构,但这通常是编译器无法识别的。
注意预增量,因为它会影响同一个obejct,通常会返回对它的引用(因此返回时不会花费)。
答案 3 :(得分:2)
通常,预增量通常优于后增量,因为可能允许进行某些优化,以避免构造临时值。至于它的实现方式取决于编译器附带的STL。
答案 4 :(得分:2)
不同之处在于它们不会产生相同的结果,而这个特定的例子将使用相同的增量形式。预增量形式首先递增该值,然后返回它;而后增量形式会增加结果,但会返回增量之前的值。对于基本类型来说,这通常是免费的,但对于像迭代器这样的东西,它需要创建一个临时值来保存非递增的值,以便稍后返回。