STL的前后增量运算符之间的概念差异

时间:2011-09-15 19:18:43

标签: c++ stl

推测:

for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{}

我确实理解了int等内置类型的前/后增量的区别,但就迭代器而言,++iter和{{1}之间的区别是什么}? (请记住,我知道两者在这里产生相同的结果)。

5 个答案:

答案 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)

不同之处在于它们不会产生相同的结果,而这个特定的例子将使用相同的增量形式。预增量形式首先递增该值,然后返回它;而后增量形式会增加结果,但会返回增量之前的值。对于基本类型来说,这通常是免费的,但对于像迭代器这样的东西,它需要创建一个临时值来保存非递增的值,以便稍后返回。