在c ++引言中,第95页作者说c ++程序员倾向于使用!=而不是<在编写循环时.
for (vector<int>::size_type i = 0; i != 10; ++i) is preferred instead of
for (vector<int>::size_type i = 0; i < 10; ++i)
Run Code Online (Sandbox Code Playgroud)
我在加速c ++中读了同样的东西.有人可以解释这背后的基本原理
Gre*_*ill 42
使用某些类型的STL迭代器(非随机访问的那些)时,必须使用!=:
for (map<int,int>::iterator i = a.begin(); i != a.end(); ++i) ...
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到任何理由更喜欢!=有序的标量类型,如您的示例中所示.我通常更喜欢<标量类型和!=所有迭代器类型.
ltj*_*jax 31
这是通用编程的习惯; 例如,您可以轻松地使用<索引,但不能将其与所有迭代器类型一起使用.列表迭代器无法有效实现<- 但是,!=即使是最简单的迭代器类型也可以实现.因此,总是使用最通用的比较是一个好习惯 - 它使您的代码更容易适应变化.
ism*_*ail 10
想想一个必须增加的情况,让我们说3而不是1.
for (vector<int>::size_type i = 0; i != 10; i+=3)
Run Code Online (Sandbox Code Playgroud)
这将永远运行,因为它将跳过10并转到12而不是永久增量.
for (vector<int>::size_type i = 0; i < 10; i+=3)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这也可以正常工作.所以!=并不总是一个好的选择.
"相互比较"的要求比"同等可比"要求强得多.当谈到遍历容器的可能性进行迭代器或通用的指标(如之间的关系比较<,>,<=等)强烈随机接入容器有关,而平等的比较是更普遍适用的(通常可用的唯一使用顺序访问容器时).
一般来说,最好使代码尽可能通用,即当较弱的需求完全足够时,不应该依赖更强的要求.换句话说,如果您只能通过使用相等比较来实现算法,那么最好这样做,而不进行任何关系比较.有可能通过更广泛的底层数据结构(容器)使您的算法更加可用.
当然,如果您不关心这种通用性或根本不需要它,您可以忽略这些注意事项并使用任何一种方法.
如果你写!=,那么你可以用最小的改变来反转循环迭代.
假设你先写:
for ( int i = m; i != n ; i++ )
Run Code Online (Sandbox Code Playgroud)
后来你扭转了它:
for ( int i = n ; i != m ; i-- )
Run Code Online (Sandbox Code Playgroud)
不那么吸引人,但它仍然需要比"<"和">" 更少的分析.