当前位置:  开发笔记 > 编程语言 > 正文

为什么对迭代器使用前缀增量形式?

如何解决《为什么对迭代器使用前缀增量形式?》经验,为你挑选了1个好方法。

Johannes Schaub 在这里声称

对于您不知道其定义的迭代器,请始终使用前缀增量形式。这将确保您的代码尽可能地通用。

for(std::vector::iterator it = v.begin(); it != v.end(); ++it) {
    /* std::cout << *it; ... */
}

为什么不首先迭代它,然后开始循环(在v.begin()+ 1)?



1> eerorika..:

为什么不首先迭代它,然后开始循环(在v.begin()+ 1)?

迭代语句始终在每次迭代结束时执行。这与您使用的增量运算符的类型无关,还是根本不使用增量运算符。

不使用迭代语句表达式的结果,因此它对循环的行为没有影响。该声明:

++it;

在功能上等效于以下语句:

it++;

仅当使用表达式的结果时,后缀和前缀增量表达式才具有不同的行为。


为什么对迭代器使用前缀增量形式?

因为后缀操作暗含一个副本。复制迭代器通常至少比不复制迭代器慢,但可能比不复制迭代器慢。

后缀增量的典型实现:

iterator tmp(*this); // copy
++(*this);           // prefix increment
return tmp;          // return copy of the temporary
                     // (this copy can be elided by NRVO)

如果不使用结果,则即使第一个副本都可以在线优化,也可以优化掉它。但这并不能保证。


我不会盲目使用“始终在迭代器中使用前缀增量”的规则。用后缀表达一些算法更清晰,尽管这只是我的观点。适用于后缀增量的算法示例:

template
OutIter copy(InIter first, InIter last, OutIter out) {
    while(first != last)
        *out++ = *first++;
    return out;
}

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有