2010-12-25 4 views
25

대신! =를 사용하는 이유 C++ 프로그래머는 루프를 작성할 때 <에서! =를 사용하는 경향이 있다고 말합니다.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++에서 동일한 내용을 읽었습니다. STL 반복자의 일부 종류 (랜덤 액세스하지 않은 것), 당신은 해야 사용 != 사용하는 경우 다른 사람이

+7

위 코드를 작성하는 사람은 모두 실행해야합니다. http://blogs.csoonline.com/node/151 – ybungalobill

+2

참조 @ybungalobill : 좋은 기사, 나쁜 결론 :) – Kos

+1

@Kos : 그냥 농담 :) 물론 for 루프에서는 그렇게 중요하지 않습니다. – ybungalobill

답변

42

뒤에 이론적 근거를 설명 할 수 그러나

for (map<int,int>::iterator i = a.begin(); i != a.end(); ++i) ... 

을, 나는 어떤 표시되지 않습니다 귀하의 예제처럼 잘 정렬 된 스칼라 유형을 선호하는 이유는 !=입니다. 일반적으로 스칼라 유형은 <이고 모든 반복기 유형은 !=을 선호합니다.

+2

그럼 모든 for 루프가 동일하게 읽을 수있는 이유는 같을 것입니다. –

+10

수정 : 랜덤 액세스를 제외한 STL 반복자를 사용할 때는! =을 사용해야합니다. 벡터 의 경우 <가 좋음. – zeuxcg

+1

모든 STL 반복자에 대해'! ='를 사용할 필요는 없습니다. 무작위 접근 반복자는'<'와 마찬가지로 잘 동작 할 것이다. – ltjax

31

일반 프로그래밍의 습관입니다. 예를 들어, 인덱스와 함께 <을 쉽게 사용할 수 있지만 모든 반복기 유형에서 사용할 수는 없습니다. 목록 반복자는 <을 효율적으로 구현할 수 없지만 가장 간단한 반복자 유형의 경우에도 !=을 구현할 수 있습니다. 따라서 항상 가장 일반적인 비교를 사용하는 것이 좋은 습관입니다. 변경하면 코드가 더욱 탄력적입니다.

8

일반적으로 모든 반복기가 "<"작업을 지원하지 않기 때문에. 각 반복자 유형에서 지원되는 작업은 the manual을 참조하십시오. 반복자

7

"관계형 필적"이라는 요건을 사이 무작위 액세스 반복자 (그 중 간단한 포인터 서브 세트) (> < 및) 부등식 비교 지원되는 요건보다 하나 더 강한 "동등 비교" . 컨테이너 반복에 관해서는, 이터레이터 또는 일반 인덱스 (예 : <, >, <= 등) 간의 관계를 비교할 수있는 가능성은 랜덤 액세스 컨테이너와 강하게 관련이 있지만 평등 비교는 보편적으로 적용될 수 있습니다 순차 액세스 컨테이너로 작업 할 때 사용할 수있는 것만).

일반적으로 가능한 한 포괄적 인 코드를 작성하는 것이 좋습니다. 즉, 약한 요구 사항이 충분할 때 더 강력한 요구 사항에 의존해서는 안됩니다. 즉, 동등한 비교 만 사용하여 알고리즘을 구현할 수 있다면 관계형 비교를 수행하지 않고도 그렇게하는 것이 낫습니다. 더 넓은 범위의 기본 데이터 구조 (컨테이너)에서 알고리즘을 더 유용하게 만들 수 있습니다.

물론 이러한 종류의 일반성에 신경 쓰지 않거나 단순히 필요하지 않으면 이러한 고려 사항을 무시하고 두 가지 방법 중 하나를 사용할 수 있습니다.

+0

특히 수학적 근거를 토대로 합리적인 경우 _ 1 "약한 경우에는 더 강한 요구 사항에 의존해서는 안됩니다 요구 사항은 완벽하게 충분합니다 "_. – legends2k

7

!=으로 작성하면 최소한의 변경만으로 루프 반복을 되돌릴 수 있습니다.

for (int i = n ; i != m ; i--) 

너무 매력적하지,하지만 여전히 그것은 "<"와 ">"보다 적은 분석이 필요합니다

for (int i = m; i != n ; i++) 

나중에 당신이 그것을 반대 :

는 당신에게 먼저 쓰기를 가정하자.하나에 의해 증가 할 사건의

+0

그러나 첫 번째 루프는 [m, n] 범위를 커버 할 것이고 두 번째 루프는 (m, n)을 커버 할 것입니다 – ltjax

+0

@itjax : 멋지게 캐치. 나는 그것을 알아 차리지 못했습니다 :-) – Nawaz

10

생각해은 10을 생략하고 대신 12로 가서 영원히 증가하기 때문에이 영원히 실행 3 대신

for (vector<int>::size_type i = 0; i != 10; i+=3) 
1. 말할 수 있습니다.

for (vector<int>::size_type i = 0; i < 10; i+=3) 

이 경우에도 정상적으로 작동합니다. 그래서! = 항상 좋은 선택은 아닙니다.

+6

사실 첫 번째 것은 이진 컴퓨터에서 멈출 것입니다. 왜냐하면 3은 ℤ/2^nℤ 그룹의 생성기이기 때문입니다. – ybungalobill

+1

Err .. 사실입니다.하지만 실제로 묻는 질문에 대답하지 않습니다. –

+2

이것은 단지 == – ismail

0

어쩌면 사람들은 null을 검사하는 데 익숙해 졌을 것입니다. 그래서 모든 것을 똑같이 사용하십시오! 그 everyting에 대한 그래서

if(x != null) { ... } 

for(int i=0; i != 10; i++) { ... } 

는! = 또는 ==

를 읽어! 경향이있다 = ==서로 다른/EQUAL, 은 다음 NOT 같은 원리는 EQUAL입니다 ,

관련 문제