在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)
我在加速c ++中读到同样的东西。有人可以解释这个
背后的基本原理答案 0 :(得分:42)
当使用某些类型的STL迭代器(非随机访问的那些)时,必须使用!=
:
for (map<int,int>::iterator i = a.begin(); i != a.end(); ++i) ...
但是,我没有看到任何理由更喜欢!=
用于有序的标量类型,如您的示例所示。我通常更喜欢标量类型<
和所有迭代器类型!=
。
答案 1 :(得分:31)
这是通用编程的习惯;例如,您可以轻松地将<
与索引一起使用,但不能将其与所有迭代器类型一起使用。列表迭代器无法有效地实现<
- 但是,即使是最简单的迭代器类型,也可以实现!=
。因此,总是使用最通用的比较是一个好习惯 - 它使您的代码更容易适应变化。
答案 2 :(得分:10)
考虑一个必须增加的情况,让我们说3而不是1。
for (vector<int>::size_type i = 0; i != 10; i+=3)
这将永远运行,因为它将跳过10并转到12而不是永久增量。
for (vector<int>::size_type i = 0; i < 10; i+=3)
在这种情况下,这也可以正常工作。所以!=并不总是一个不错的选择。
答案 3 :(得分:8)
因为通常并非所有迭代器都支持“&lt;”操作。有关每种迭代器类型支持的操作,请参阅the manual。只有随机访问迭代器(其中,简单指针是子集)支持迭代器之间的不等式比较(&lt;和&gt;)
答案 4 :(得分:7)
“相关可比性”的要求比“同等可比”要求强得多。在迭代容器时,在迭代器或泛型索引(如<
,>
,<=
等)之间执行关系比较的可能性与随机访问容器密切相关,而平等比较更普遍适用(通常是使用顺序访问容器时唯一可用的)。
一般来说,最好使代码尽可能通用,即当较弱的需求完全足够时,您永远不应该依赖更强的要求。换句话说,如果您只能通过使用相等比较来实现算法,那么最好这样做,而不进行任何关系比较。有可能通过更广泛的底层数据结构(容器)使您的算法更具可用性。
当然,如果您不关心这种通用性或者根本不需要它,您可以忽略这些注意事项并使用任何一种方法。
答案 5 :(得分:7)
如果你写!=
,那么你可以用最小的改变来反转循环迭代。
假设你先写:
for ( int i = m; i != n ; i++ )
稍后你反过来:
for ( int i = n ; i != m ; i-- )
不那么吸引人,但仍然需要少分析而不是“&lt;”和“&gt;”。
答案 6 :(得分:0)
也许那些喜欢这个的人是因为他们习惯于检查null等等......所以在所有事情中都使用相同的!=
if(x != null) { ... }
for(int i=0; i != 10; i++) { ... }
所以对于那些每个人都倾向于!=或==
将!= 读为 DIFFERENT / NOT EQUAL , 遵循与 == 相同的原则是 EQUAL ,