문제

를 검토할 때,나는 때로는 이런 종류의가 발생 loop:

i = begin
while ( i != end ) {    
   // ... do stuff
   if ( i == end-1 (the one-but-last element) ) {
      ... do other stuff
   }
   increment i
}

그때 나는 질문:당신이 쓰기?

i = begin
mid = ( end - begin ) / 2 // (the middle element)
while ( i != end ) {    
   // ... do stuff
   if ( i > mid ) {
      ... do other stuff
   }
   increment i
}

제 생각에는,이 비트 쓰기의 기도 루:당신은 루프의 무언가가 있기 때문에 일반적인 수행에 대한 각각의 요소입니다.사용하는 이성에 대한 일부의 요소가 당신이 뭔가 다릅니다.그래서 나는 결론을 필요가 별도의 루프 이러한 요소:

i = begin
mid = ( end - begin ) / 2 //(the middle element)
while ( i != mid ) {    
   // ... do stuff
   increment i
}

while ( i != end ) {
   // ... do stuff
   // ... do other stuff
   increment i
}

지금보 질문 에 그래서를 작성하는 방법 if-절에서는 좋은 방법...고 슬픈:가 바로 여기에 있습니다.

내가 잘못입니까?그렇다면,무엇이 그리 좋은데 어지럽히 루프 본문과 함께 특별한 경우,당신이 알고 있는 선행,코딩에서 시간은?

도움이 되었습니까?

해결책

@xtofl,

나는 당신의 우려에 동의합니다.

백만 번은 비슷한 문제를 겪었습니다.

개발자는 첫 번째 또는 마지막 요소에 대한 특수 처리를 추가합니다.

대부분의 경우 startIdx + 1 또는 endidx -1 하나의 롱 루프를 여러 개의 짧은 루프로 분할하십시오.

매우 드문 경우 루프를 분할 할 수 없습니다.

제 생각에는 드문 가능할 때마다 루프 외부에서 물건을 처리해야합니다.

다른 팁

나는 생각하지 않는 이 질문에 대답하여 원리(예:"루프에서,치료하는 모든 요소가 동등하게").대신,당신이 볼 수있는 두 가지 요인을 평가하는 경우에는 구현이 좋거나 나쁜:

  1. 타 유효성-은 컴파일 된 코드,빠른 실행하거나는 것이 더 빨리 하고 그것을 다르게?
  2. 코드 유지관리-그것은 쉬운(에 대한 다른 개발자)무슨 일이 일어나고 있는지 이해하기까요?

면 그것은 더 빠르고 코드 더 읽을 수 있는 모든 일에 하나,그것는 방법입니다.는 경우 느리고 덜 읽을 수 있는,그것을 할 다른 방법이다.

면 그것은 더 빠르고 적은 readably,또는 느리지만 더 읽을 수 있는 요소의 문제가 더 귀하의 특정한 경우,그리고 다음 방법을 결정하는 루프(또는지를 반복).

사람들이 배열의 요소를 쉼표로 구한 문자열로 결합하려고 할 때 이것을 보았다는 것을 알고 있습니다.

for(i=0;i<elements.size;i++) {
   if (i>0) {
     string += ','
   }
   string += elements[i]
}

당신은 거기에있는 경우에 그것을 가지고 있거나 끝에서 string += 줄을 다시 복제해야합니다.

이 경우 명백한 해결책은입니다

string = elements.join(',')

그러나 결합 방법은 내부적으로 동일한 루프를 수행합니다. 그리고 항상 당신이 원하는 것을하는 방법이 없습니다.

나는 특별한 경우를 고리에 넣을 때, 나는 보통 내 자신의 이익을 위해 너무 영리하다는 것을 깨달았습니다.

마지막으로 게시 한 스 니펫에서는 // .... 작업을 반복하고 있습니다.

다른 지수 세트에서 완전히 다른 작업 세트를 가지고있을 때 2 루프를 유지하는 것이 좋습니다.

i = begin
mid = ( end - begin ) / 2 //(the middle element)
while ( i != mid ) {    
   // ... do stuff
   increment i
}

while ( i != end ) {
   // ... do other stuff
   increment i
}

그렇지 않은 경우에도 여전히 하나의 단일 루프를 유지하고 싶을 것입니다. 그러나 여전히 저장 (종료 - 시작) / 2 비교 수는 여전히 남아 있습니다. 따라서 코드가 깔끔하게 보이거나 CPU 사이클을 절약하고 싶은지 여부는 요약됩니다. 전화는 당신의 것입니다.

나는 당신이 그것을 완전히 못 박았다고 생각합니다. 대부분의 사람들은 루프에 조건부 분기를 포함시키는 함정에 빠지면 외부에서 할 수 있습니다. 더 빠르게.

예를 들어:

if(items == null)
    return null;

StringBuilder result = new StringBuilder();
if(items.Length != 0)
{
    result.Append(items[0]); // Special case outside loop.
    for(int i = 1; i < items.Length; i++) // Note: we start at element one.
    {
        result.Append(";");
        result.Append(items[i]);
    }
}
return result.ToString();

그리고 당신이 묘사 한 중간 사건은 단지 평범합니다 끔찍한. 해당 코드가 성장하여 다른 방법으로 리 페이션해야한다고 상상해보십시오.

XML을 구문 분석하지 않는 한u003Cgrin> 루프는 가능한 한 간단하고 간결하게 유지해야합니다.

나는 생각에 대한 반복되는 의미를 다루는 모든 요소가 동등하게 대우한다.불행하게도 때로는 특별한 경우 및 이러한 처리해야 루프 안에서 구조를 통해 경우에 문이 있습니다.

많은 경우 특별한 경우에도 당신은 아마 생각에 대해 오는 어떤 방법을 다루는 두 개의 서로 다른 세트의 요소를 별도로 구성 합니다.

나는 단순히 루프에서 요소를 제외하고 루프 밖에서 스피어 레이트 처리를 선호합니다.

예 : EOF의 경우를 고려해 봅시다

i = begin
while ( i != end -1 ) {    
   // ... do stuff for element from begn to second last element
   increment i
}

if(given_array(end -1) != ''){
   // do stuff for the EOF element in the array
}

물론, 꺼낼 수있는 고리에서 특별한 케이스를 꺼내는 것은 바보입니다. 그래도 do_stuff도 복제하지 않을 것입니다. 나는 그것을 함수 나 매크로에 넣어서 코드를 복사하지 않습니다.

내가 싫어하는 또 다른 것은 사례 패턴:

for (i=0; i<5; i++)
{
  switch(i)
  {
    case 0:
      // something
      break;
    case 1:
      // something else
      break;
    // etc...
  }
}

나는 이것을 실제 코드에서 보았다.

어느 것이 더 잘 수행됩니까?

항목의 수가 매우 크면 항상 한 번 루프를합니다. 특히 수행하려는 경우 약간 모든 항목에서 작동합니다. 조건부를 평가하는 비용은 두 번 루핑보다 낮을 수 있습니다.

죄송합니다. 물론 두 번 반복하지 않습니다 ...이 경우 두 개의 루프가 바람직합니다. 그러나 주요 고려 사항은 성능이어야한다고 주장합니다. 루프 경계 (한 번)의 간단한 조작으로 작업을 분할 할 수있는 경우 루프 (N 회)에서 조건부가 발생할 필요가 없습니다.

특별 케이스는 한 번만 수행 해야하는 경우 루프 외부에서 수행해야합니다.

그러나 스코핑으로 인해 루프 내부를 유지하기가 더 쉬운 인덱스 또는 다른 변수가있을 수 있습니다. 또한 루프 제어 구조 내부의 데이터 구조에 대한 모든 운영을 함께 유지해야 할 상황에 대한 이유가있을 수 있지만, 그 자체로는 약한 논쟁이라고 생각합니다.

그것은 필요와 편의에 따라 그것을 사용하는 것입니다. 요소를 동등하게 취급 할 언급은 없으며 언어가 제공하는 기능을 클럽시키는 데 확실히 아무런 해가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top