c ++ for循环临时变量使用

Amo*_*wai 5 c++ for-loop

以下哪项更好,为什么?(特别是c ++)

一个.

int i(0), iMax(vec.length());//vec is a container, say std::vector
for(;i < iMax; ++i)
{
  //loop body
}
Run Code Online (Sandbox Code Playgroud)

for( int i(0);i < vec.length(); ++i)
{
  //loop body
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了(a)的建议,因为调用了长度函数.这让我很烦.没有任何现代编译器将(b)的优化与(a)类似吗?

And*_*erd 12

示例(b)与示例(a)具有不同的含义,编译器必须在编写时对其进行解释.

如果,(由于某些我无法想到的原因),我编写了代码来执行此操作:

for( int i(0);i < vec.length(); ++i)
{
    if(i%4 == 0)
       vec.push_back(Widget());
}
Run Code Online (Sandbox Code Playgroud)

我真的不希望编译器优化每次调用vec.length(),因为我会得到不同的结果.

  • 编译器优化与否如果你使用iterator与begin() - end()你将获得一次结束指针,你不需要担心大小和所有... (4认同)

Ass*_*vie 10

我喜欢:

for (int i = 0, e = vec.length(); i != e; ++i)
Run Code Online (Sandbox Code Playgroud)

当然,这也适用于迭代器:

for (vector<int>::const_iterator i = v.begin(), e = v.end(); i != e; ++i)
Run Code Online (Sandbox Code Playgroud)

我喜欢这个,因为它既有效率(end()只调用一次),也相对简洁(只需输入vector<int>::const_iterator一次).


rlb*_*ond 5

我很惊讶没有人说明显的:

在99.99%的情况下,没关系.

除非你使用的size()是计算是一项昂贵的操作的容器,否则你的程序甚至会慢几纳秒,这是不可思议的.我会说在您分析代码并发现这size()是一个瓶颈之前,坚持使用更具可读性.

  • 在99.99%的情况下,没关系.只有(a)如果size()在循环内部发生变化,或(b)如果检查size()非常慢,那么这一点很重要. (3认同)