2010-04-26 8 views
1

std :: sort를 사용하여 벡터를 정렬하고 싶습니다. 그러나 내 정렬 방법은 클래스의 정적 메서드이며 std :: sort를 호출하고 싶지만 문제가되는 것 같습니다. 이 방법.C++ 정렬 방법

static int CompareIt(void *sol1, void *sol2) { ... } 

표준 : : 정렬 전화 : 클래스에

sort(distanceList.at(q).begin(), 
    distanceList.at(q).end(), 
    &DistanceNodeComparator::CompareIt); 

은이 방법을 수행 할 수 있어야하지 않나요?

+3

std :: sort와 qsort가 혼동스러워 보입니다. –

답변

0

기타 언급 한 바와 같이, it needs a boolean return type. 위의

#include "stdafx.h" 
#include <vector> 
#include <algorithm> 

using namespace std; 

class MyClass 
{ 
public: 
    static bool CompareIt(const void *a1, const void *a2) 
    { 
     return a1 < a2; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    // Create a vector that contains elements of type MyData 
    vector<void*> myvector; 

    // Add data to the vector 
    myvector.push_back((void*)0x00000005); 
    myvector.push_back((void*)0x00000001); 

    // Sort the vector 
    std::sort(myvector.begin(), myvector.end(), MyClass::CompareIt); 

    // Display some results 
    for(int i = 0; i < myvector.size(); i++) 
    { 
     printf("%d = 0x%08X\n", i, myvector[i]); 
    } 

    return 0; 
} 

[편집] 업데이트 코드가 조금 더 간단하게 : 여기에 작동하는 예입니다. 좋은 코드를 제안하는 것은 아니지만 OP 실제 구현에 대해 더 많이 알지 못하는 한 더 나은 예제를 제공하는 것은 어렵습니다!

+0

예제에서 <연산자를 호출하는 경우에만 CompareIt 함수를 갖는 것이 무엇입니까? 이 경우 std :: sort (myvector.begin(), myvector.end()) 충분하지 않아야합니까? 필자의 경우, 수신 된 비교기에 따라 다형성 동작을 수행하지 않아도됩니다. – dmessf

+0

나는 이것이 STL을 (ab) 사용하는 끔찍한 방법이라고 말해야 만한다. * void *의 벡터를 가질 수는 있지만 실제로 그렇게하는 것은 거의 불가능합니다. –

+0

나는 OP가 그/그녀의 질문에서 질문 한 것에 대한 원리의 증명으로 명백하게 작동했던 예를 원했다. OP가 실제로 해결하고있는 것에 대한 자세한 내용을 게시하지 않은 경우 이는 물론 쓸데없는/위험한 예입니다. –

4

std::sort은 컬렉션에 보유 된 유형의 값을 허용하고 bool을 반환하는 비교자를 사용합니다. 일반적으로 <이라는 개념을 구현해야합니다. 예, 가정 당신의 distanceList 요소는 정수의 컬렉션이 (내가 그렇지 않은 가정하지만, 예를 위해서) :

static bool CompareIt(int sol1, int sol2) { ... } 

그리고이 있지 않은 경우 물론 당신은 단지 비교기를 제공해야 시나리오에 맞는 작업을 수행하는 < 연산자.

1

그것은 부울 방법이어야

0

우선 (정렬 값을 비교하여 기본 연산자 <()를 사용), 복귀 bool 타입이어야한다. 실제로 요구 사항은 반환 유형을 bool (int)으로 지정할 수 있다는 것입니다. 그러나 당신이 int을 반환한다는 사실은 std :: sort가 요구하는 엄격한 약한 순서 대신에 3 방향 비교자를 작성했을지도 모른다는 것을 암시합니다.

CompareIt 함수는 두 개의 void* 포인터를 매개 변수로 사용합니다. distanceList.at(q)vector<void*> (또는 void*으로 변환 가능한 벡터입니까?)입니까? 그렇지 않으면 비교기 입력이 올바르지 않습니다. 알고리즘이있는 void*을 사용하면 일반적인 프로그래밍의 요점은 나중에 불투명 포인터가 필요 없어 원래 유형으로 다시 캐스팅되기 때문에 잘못된 결과가 나왔다는 것입니다.

1

제공 한 비교 기능에는 qsort이 필요로하는 서명이 있습니다.이 기능은 C++이 제공되기 전에 제공 한 정렬 기능입니다. sort은 완전히 다른 기능이 필요합니다. 표준 sort 알고리즘과 std::list를 정렬하는 list가 자신의 sort 멤버를 공급하는 이유입니다, 효율적 아니라고

static bool CompareIt(const DistanceNode &sol1, const DistanceNode &sol2) 
{ 
    return sol1.key < sol2.key; 
} 

주의 사항 : 예를 들어

distanceList 당신의 선언은 함수처럼 보일 것이다 std::vector<DistanceNode> 경우 기능.