2012-11-14 3 views
0

내 코드가 내 Visual Studio 2010에는 있지만 DevCPP에는 문제가 있습니다. Heres 상황, 나는 pair<string, double>을 삽입하려면 내 코드에서 C++ STL set을 사용했지만 그 다음에 키를 사용하여 값을 사용하여 내 set을 정렬해야하므로이를 달성하기 위해 사용자 지정 비교기를 사용했습니다.Visual Studio 어설 션이 C++ 세트 비교기에서 실패했습니다.

struct sortPairSecond 
{ 
    bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs) 
    { 
    return lhs.second >= rhs.second; 
    } 
}; 

코드는 DevCPP에서 잘 작동하지만 디버그 어설 VS2010를 사용하여 xtree에 실패가 발생했습니다. 일부 디버깅을했는데 오류가 사용자 정의 비교기에서> =를 사용하여 발생했음을 알았습니다. = 제거하면 코드가 작동하지만 잘못된 결과는 프로그램에서 허용되어야합니다. 그러므로 누구든지이 문제에 대해 저를 도울 수 있습니까?

답변

7

귀하는 따라서 엄격한 순서로 op(a,b) 필요로하고 op(b,a) 모두 사실이 될 수 없습니다 (그러나 그들은 동일한 있다면 그들은 것) 때문에 유효하지 않을 수 있습니다 >=하지 >를 사용하여.

단지 어설 션 오류이지만 set에는 중복 값을 포함 할 수 없습니다. vector으로 정렬하거나 multiset을 사용할 수 있습니다 ('>'사용)

물론 첫 번째 값이 고유하다는 것을 알고 있으므로 두 번째 값이 첫 번째 값과 같을 때 조건자를 확장 할 수 있습니다. 그러면 고유 한 값이 보장되고 std::set을 계속 사용할 수 있습니다.

struct sortPairSecond 
{ 
    bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs) const 
    { 
    return (lhs.second > rhs.second) || (lhs.second == rhs.second && lhs.first > rhs.first) ; 
    } 
}; 

기본적으로, 당신의 술어를 조작하는 시도에 의해 사용하기위한 것입니다 무엇을 std::set "휴식"을하려고하지 않습니다.

+1

절대적으로> =은 허용되지 않으며>해야합니다. 그러나'std :: multiset'에서도>를 사용해야합니다. – john

+0

답변을 주셔서 감사합니다. 이제 코드가 작동하고 초기 실수를 인식하게되었습니다. 어쨌든, 코드가 DevCPP에서는 잘 실행되지만 VS2010에서는 제대로 실행되지 않는 이유는 무엇입니까? –

+0

DevCPP는 어설 션을 검사하지 않고 정렬을 시도하지만 어떤 방식으로 생성되는지에 대한 "정의되지 않은"동작입니다. VS2010은 릴리스 빌드에서도 동일한 작업을 수행합니다. – CashCow

관련 문제