2012-03-11 3 views
1

사용자 지정 비교기 클래스에서 C++ 벡터를 정렬 할 때 이상한 동작이 발생합니다.사용자 지정 비교기를 사용하여 벡터 정렬을 그냥 반전합니다.

다른 배열의 일부 값을 기반으로 인덱스 배열을 정렬하려고합니다. 그러나 내가 알 수있는 한 정렬 함수는 색인을 바꿉니다. 필자는 compare 함수의 일부 로깅을했는데, 정상적으로 작동하는 것 같습니다.

내가 뭘 잘못하고 있는지 알아볼 수있는 사람이 있습니까?

내 코드 :

template<class T> 
class Comparator { 
    vector<T> & data; 
public: 
    bool operator()(int a, int b) { 
    return data.at(a) < data.at(b) ? -1 : (data.at(a) > data.at(b) ? 1 : 0); 
    } 

    Comparator(vector<T> & data) : data(data) {} 
}; 

void sortTest2() { 
    //SETUP 
    int n = 5; 
    vector<int> indexes(n); 
    newIdAr(indexes, n); //init to {0,1,2,3,4} 
    vector<double> data(n); 
    randomData(data, n); //Init to radom data 
    Comparator<double> comparator(data); 

    //TEST 
    print(indexes, data, n); // Prints [0.00125126, 0.563585, 0.193304, 0.808741] 
    sort(indexes.begin(), indexes.end(),comparator); 
    print(indexes, data, n); // Prints [0.808741, 0.193304, 0.563585, 0.00125126] 
    sort(indexes.begin(), indexes.end(),comparator); 
    print(indexes, data, n); // Prints [0.00125126, 0.563585, 0.193304, 0.808741] 
    cout << "Shuffle" << endl; 
    random_shuffle(indexes.begin(), indexes.end()); 
    print(indexes, data, n); 
    sort(indexes.begin(), indexes.end(), comparator); 
    print(indexes, data, n); 
} 

내 출력 : 보조 기능

[0.00125126, 0.563585, 0.193304, 0.808741, 0.585009] 
[0.585009, 0.808741, 0.193304, 0.563585, 0.00125126] 
[0.00125126, 0.563585, 0.193304, 0.808741, 0.585009] 
Shuffle 
[0.193304, 0.00125126, 0.585009, 0.563585, 0.808741] 
[0.808741, 0.563585, 0.585009, 0.00125126, 0.193304] 

코드 :

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

void print(vector<int> & sort, vector<double> & data, int N) { 
    cout << "["; 
    for (int i = 0; i < N - 1; ++i) { 
    cout << data[sort[i]] << ", "; 
    } 
    cout << data[sort[N - 1]] << "]" << endl; 
} 

void newIdAr(vector<int> & ar, int N) { 
    for (int i = 0; i < N; ++i) { 
    ar[i] = i; 
    } 
} 

void randomData(vector<double> & data, int n) { 
    for (int i = 0; i < n; ++i) { 
    data[i] = ((double) rand())/RAND_MAX; 
    } 
} 

답변

2

비교기 반환해야합니다 첫 번째 인수가보다 낮은 경우는 true 두 번째 것은 그렇지 않으면 거짓입니다. 0, -1 및 1을 반환하는 것은 코드에서 유효하지 않습니다.

당신은 비교기의 operator() 서명을 analizing하여이를 실현할 수 :

bool operator()(int a, int b) 

나는 당신의 구현이 있어야한다고 생각 :

bool operator()(int a, int b) { 
    return data.at(a) < data.at(b); 
} 
관련 문제