为什么c ++程序员使用!=而不是<

时间:2010-12-25 19:42:34

标签: c++

在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 ++中读到同样的东西。有人可以解释这个

背后的基本原理

7 个答案:

答案 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