Johannes Schaub 在这里声称
对于您不知道其定义的迭代器,请始终使用前缀增量形式。这将确保您的代码尽可能地通用。
for(std::vector::iterator it = v.begin(); it != v.end(); ++it) { /* std::cout << *it; ... */ }
为什么不首先迭代它,然后开始循环(在v.begin()+ 1)?
为什么不首先迭代它,然后开始循环(在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)
如果不使用结果,则即使第一个副本都可以在线优化,也可以优化掉它。但这并不能保证。
我不会盲目使用“始终在迭代器中使用前缀增量”的规则。用后缀表达一些算法更清晰,尽管这只是我的观点。适用于后缀增量的算法示例:
templateOutIter copy(InIter first, InIter last, OutIter out) { while(first != last) *out++ = *first++; return out; }