2013-02-09 3 views
0

와 종류 나는 지금 내가 두 번을 또 다른 벡터를 기반으로 인덱스 벡터를 정렬하는 간단한 분류 코드가 다음 코드표준 : : out_of_range : 사용자 정의 비교

template<typename T> 
bool GenericCompare(T lhs, T rhs) 
{ 
    return lhs < rhs; 
} 


template<typename T> 
class SortOrder 
{ 
public: 

    SortOrder(const std::vector<T> *_sortArray, 
       bool (*_comparator)(T,T) = GenericCompare) : 
    sortArray(_sortArray) , comparator (_comparator) , customOperator(true) {;} 

    bool operator()(int lhs=0, int rhs=0) const 
    { 

     bool res; 

     try { 
      sortArray->at(lhs); 

     } 
     catch (std::out_of_range& oor) { 
      std::cout << "LHS Out of range: " << lhs << " : " << rhs 
         << " " << oor.what() << std::endl; 
     } 
     try { 
      sortArray->at(rhs); 
     } 
     catch (std::out_of_range& oor) { 
      std::cout << "RHS Out of range: " << lhs << " : " 
         << rhs << " "<< oor.what() << std::endl; 

     } 
     // Always needs comparator 
     res = comparator(sortArray->at(lhs),sortArray->at(rhs));  
     return res; 

    } 
    private: 
    const std::vector<T> *sortArray; 
    bool (*comparator)(T,T); 
    bool customOperator; 
    }; 

있습니다. 'circle_fwd_vector'는 모든 double을 포함하는 벡터입니다. 콘솔에서 이제

for (int i=0;i<circle_fwd_vector.size();i++) { 
    circle_index_vector.push_back(i); 
} 
try { 
    std::sort(circle_index_vector.begin(),circle_index_vector.end(), 
      SortOrder<double>(&circle_fwd_vector)); 
} 
catch (std::exception& e) 
{ 
    std::cout << e.what() << std::endl; 
} 

는,이 같은 결과를 받고 있어요 :

RHS Out of range: 1711 : 1079615151 vector::_M_range_check 

나는 사용자 정의 클래스와 I 정렬있어 벡터를 사용하지 않는 때문에 기반으로 그냥 두 배로 왜 내가 범위를 벗어나는 지 모르겠다. 나는 double vector에 무한대가 존재하지 않는다는 것을 확인했다. 그러나 std :: sort는 여전히 인덱스에서 벗어나지 않고 올바른 정렬 된 인덱스를 제공하지 않아야한다.

도움 주셔서 감사합니다.

편집 : 도움이된다면, 여기에 벡터의 데이터 덤프가 있습니다. http://pastebin.com/7wLX63FJ 또한 Xcode 3.2.6과 함께 제공되는 GCC 4.2를 사용하여 컴파일 중입니다.

+1

'circle_fwd_vector'가 비어 있지 않습니까? 그건 그렇고,'circle_index_vector'의 마지막 요소를 정렬에서 벗어나는 이유가 무엇입니까? 표준 알고리즘이 반 개방 범위에서 작동한다는 것을 알고 있습니까? –

+0

죄송합니다. 코드를 수정했습니다. 마지막 요소가 생략 되어도 동일한 결과를 생성합니다. 또한 벡터가 비어 있지 않은지 확인했습니다. 여전히 같은 결과입니다. – rwb

+0

질문에서 편집을 참조하십시오. 또한 도움이된다면 벡터에 데이터를 추가했습니다. – rwb

답변

2

이 오류는 데이터의 nan 값 (위치 1688)으로 인해 발생합니다. 문제는 <nan을 포함 할 때 std::sort에서 요구하는 제약 조건을 더 이상 충족시키지 못한다는 것입니다. 모든 Comparator가 만족해야하는 "strict weak ordering"의 정의에 대해서는 표준 25.4/4를 참조하십시오.

+0

예! 그것은 그것을 고쳤다! 난이 <피연산자를 실패한다는 것을 몰랐다. 어쨌든 고마워! – rwb