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

ame*_*een 25 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) 
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)

但是,我没有看到任何理由更喜欢!=有序的标量类型,如您的示例中所示.我通常更喜欢<标量类型和!=所有迭代器类型.

  • 更正:使用STL迭代器时,除了随机访问之外,必须使用!=.所以在vector <int>的情况下,<很好. (10认同)
  • 嗯,我想原因是所有你的for循环读取相同 (2认同)

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)

在这种情况下,这也可以正常工作.所以!=并不总是一个好的选择.

  • 实际上第一个将停在二进制计算机上,这是因为3是ℤ/ 2 ^nℤ组的生成器. (6认同)
  • 这只是使用!=的反驳论据 (2认同)

nim*_*odm 8

因为,通常,并非所有迭代器都支持"<"操作.有关每种迭代器类型支持的操作,请参阅手册.只有随机访问迭代器(其中,简单指针是子集)支持迭代器之间的不等式比较(<和>)


AnT*_*AnT 7

"相互比较"的要求比"同等可比"要求强得多.当谈到遍历容器的可能性进行迭代器或通用的指标(如之间的关系比较<,>,<=等)强烈随机接入容器有关,而平等的比较是更普遍适用的(通常可用的唯一使用顺序访问容器时).

一般来说,最好使代码尽可能通用,即当较弱的需求完全足够时,不应该依赖更强的要求.换句话说,如果您只能通过使用相等比较来实现算法,那么最好这样做,而不进行任何关系比较.有可能通过更广泛的底层数据结构(容器)使您的算法更加可用.

当然,如果您不关心这种通用性或根本不需要它,您可以忽略这些注意事项并使用任何一种方法.


Naw*_*waz 7

如果你写!=,那么你可以用最小的改变来反转循环迭代.

假设你先写:

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)

不那么吸引人,但它仍然需要比"<"和">" 更少的分析.