2013-09-25 7 views
-1

나는 할당을 위해받은 sorted_vector 헤더 파일의 벡터에 대해 .find를위한 템플릿 기능을 가지고 있습니다. 다른 방법/생성자에 대한 단위 테스트를하고 있는데, BOOST 라이브러리를 사용하여 버그가 없는지 확인하고 버그가있을 경우에 대비하여 코드를보다 확실하게 작성합니다.두 코드 블록의 차이점은 무엇입니까?

template <typename T> 
typename sorted_vector<T>::iterator sorted_vector<T>::find(value_type const& value) const { 
    auto front = beg_; 
    auto back = end_; 

     for(;;) { 
      auto p = (back - front)/2 + front; 
      if(p == end_) 
       return p; 
      else if(*p == value) 
       return p; 
      else if(*p > value) 
       back = p; 
      else 
       front = p + 1; 
     } 
} 

그리고이 블록 :에 대한 무한의 if 문

template <typename T> 
typename sorted_vector<T>::iterator sorted_vector<T>::find(value_type const& value) const { 
    auto front = beg_; 
    auto back = end_; 

    for(;;) { 
     auto p = (back - front)/2 + front; 
     if(p == back) 
      return end_; 
     else if(*p == value) 
      return p; 
     else if(*p > value) 
      back = p; 
     else 
      front = p + 1; 
    } 
} 

내 질문은 첫 번째에 관한입니다 난 그냥이 두 코드 블록의 차이점에 대한 빠른 질문을했다. 첫 번째 코드 블록에서 끝 대신 값을 찾을 수없는 경우 벡터를 반복 할 때마다 중간 값이 반환됩니까? 아니면 두 if 문 사이의 주요 차이점은 무엇입니까?

감사합니다. 그들은이 방법을 인스턴스화하는 beg_ 및 end_에 대한

편집 :

private beg_; 
private end_; 

여기에들이 일반적으로 사용하는 방법은 다음과 같습니다

sorted_vector() : beg_(nullptr), end_(nullptr), cap_(nullptr) { } 
iterator begin() { return iterator(beg_); } 
iterator end() { return iterator(end_); } 
+1

두 번째 형식은 조금 더 형식이 좋습니다. –

+0

'private'형식을 사용할 수 없습니다. –

답변

6

음을 (p는 값보다 큰 경우, 다시 P로 설정되어 있기 때문에), 그 beg_end_ 처음 및 저장 시퀀스 [beg_, end_)의 끝을 지정하는 클래스의 멤버 변수가있는 것으로 보인다. 이 값은 절대로 바뀌지 않으므로 코드의 첫 번째 버전은 단순히 부정확합니다. 이진 검색 중에 p의 값은 end_과 같을 기회가 없습니다 (특정 사례의 좁은 집합을 제외하고는 키가 저장된 값 중 하나). 키가 배열에없고 배열의 마지막 값보다 크지 않으면 첫 번째 버전이 무한 사이클에 멈추는 것으로 예상됩니다.

한편, 두 번째 버전은 올바르게 구현 (그것은 다른 버그가없는 가정)는하지 원래의 단부에 대하여, 원래의 시퀀스의 전류 서브 세그먼트 [front, back) 끝에 대해 ​​p를 점검 순서.

어쨌든이 규칙을 따르지 않으면이 코드를 완전히 분석 할 수 없습니다. 예를 들어 end_은 무엇입니까? Is는 배열의 마지막 요소에 대한 반복자입니까? 아니면 배열의 마지막 요소에 대한 iterator입니까?

+0

예, beg_ 및 end_는 모두 개인 변수입니다. 그래서 내가 1-1000에서 1001 ints의 벡터를 가지고 있고 나는 값을 찾는다. 어떤 값으로 인해 end_와 같지 않을까요? beg_, end_ 또는 중간? 아니면 어떤 임의의 가치로 인해 문제가 발생할 수 있습니까? – Delete

+1

맞습니다. 첫 번째 것은 버그입니다. 하나의 원소를 가진 배열을 생각해 보자. 그 원소는 0이고, 'value'는 1이다. 이것은'back'을'front'과 같게 만들 것이고, loop는 영원히 만들 것이다. 또는 -1의 'value'를 검색해보십시오. '앞'을 증가시키고 배열의 끝을 지나치는 참조를 증가시킵니다. 이 코드는 값이 배열에 있고 배열이 정렬되어있는 경우에만 실제로 작동합니다. – Nemo

+1

@Aaron G : 배열에 없거나 동시에 배열의 최대 값보다 크지 않은 값 배열은 무한 사이클 또는 어쩌면 정의되지 않은 동작을 야기합니다. 예를 들어'{1, 8, 20} '배열에서'5'를 검색하면 첫 번째 버전이 제대로 작동하지 않습니다. – AnT

1

차이가있다. 그것이하는 일에 대해 완전히 옳다. 그러나 "back = p;"라는 줄을 명심하라.

몇 차례 반복 한 후에는 뒤로가 가장 큰 값으로 변경 될 가능성이 높습니다.

+0

나는 '뒤로'가 "더 큰 값으로 어떻게 변화 할 수 있는지"나는 볼 수 없다. 'p'는 '앞'과 '뒷'의 중간 점으로 계산됩니다. 그래서, 우리가'back = p' 할 때, 우리는 항상'back' * backwards *를 더 작은 * 값으로 움직입니다. 그리고 그것은 '뒤로'가 바뀔 수있는 유일한 곳입니다. – AnT

+0

이 줄은 점점 커지는 것을 보여줍니다 : auto p = (뒤 - 앞)/2 + 앞; – Garrett

+0

정확히 무엇보다 큽니까? 이 줄은 항상'뒤로 '보다 작은 * p를 생성합니다. – AnT

관련 문제