迭代器样式c ++

Cam*_*out 0 c++

什么时候声明迭代器更好?这是从cprogramming.com获取的一些示例代码,只是为了说明我所指的内容.

在for循环中?

for(vector<int>::iterator myIntVectorIterator = myIntVector.begin(); 
        myIntVectorIterator != myIntVector.end();
        myIntVectorIterator++)
{
    cout<<*myIntVectorIterator<<" ";
}
Run Code Online (Sandbox Code Playgroud)

或者在for循环之外?

vector<int>::iterator myIntVectorIterator;

for(myIntVectorIterator = myIntVector.begin(); 
        myIntVectorIterator != myIntVector.end();
        myIntVectorIterator++)
{
    cout<<*myIntVectorIterator<<" ";
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*nch 6

这两种风格之间几乎没有功能差异.选择使您的代码最具可读性的那个.

或者,C++ 2011包含一个基于范围的for循环,它比以下任一选项更具可读性:

for (int & element : myIntVector) {
    cout << element << " ";
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*ker 5

典型的做法是将所有变量声明在它们将被使用的相同范围内.遵循这个原则,你应该在循环声明中声明你的迭代器变量.

正如评论者所指出的那样,在循环之外声明迭代器并没有,但我可以想到为什么它不是一个好主意的几个原因.

  • 它使代码的可读性降低.这始终是一个观点问题,但根据我的经验,看着你的代码的人会看到你的迭代器在函数的开头被声明,并且会花费额外的时间来找到它被使用的地方,浪费了一个"脑循环"一个没有答案的问题.我承认这是一个小小的抱怨,但随着你的代码越来越复杂,我发现你通常希望尽可能简单地理解它.
  • 它没有做任何事情.与上述相关的排序,循环迭代器通常不具有与它们相关的循环之外的任何上下文.如果您不打算再次使用该值,为什么要在循环外使用它?
  • 它使您的代码不易维护.如果你只有少量的循环,那么这个论点就会分崩离析,但这意味着当你修改你的代码时,你现在必须花费另一个脑循环:"这个变量又属于哪个循环呢?" 有点交易.就像我的第一点一样,这是一个小问题,但我再次发现,尽量减少你必须考虑代码的时间(即使它只是一个小的收益)也有很长的路要走.

当然,正如许多其他人所指出的那样,这两种方法之间没有实际的区别,并且您可能有使用相关或必要的用例,或者它可能只是风格问题.但是,如果你可以避免它,我建议不要在比循环更高的范围内声明循环迭代器.