2017-09-23 12 views
0

안녕하세요, 저는 알고리즘 문제를 정렬하는 일종의 문제를 해결하고 있습니다.C + +에서 std :: priority_queue 알파벳순 정렬 순서를 반대로하는 간단한 방법?

STL 큐 헤더와 함께 C++ STL priority_queue를 사용하여 일부 정수와 역순으로 알파벳 순서로 문자열 입력을 정렬하고 있습니다.

정수형 정렬의 증분 순서를 이와 같이 우선 순위 큐와 함께 구현하는 간단한 아이디어가 있음을 알고 있습니다.

#include <queue> 

priority_queue<int> pq; 
int arr[5] = {4,3,2,1,5}; 

for(int i = 0; i < 5; i++) 
    pq.push(-arr[i]); 
while(!pq.empty()) { 
    cout << -pq.top() << endl; 
    pq.pop(); 
} 
//the result may be 1, 2, 3, 4, 5 

아니면 덜 연산자를 사용하여 다음과 같이 구현할 수 있습니다

priority_queue<int, vector<int>, less<int>> pq; 
int arr[5] = {4,3,2,1,5}; 

for(int i = 0; i < 5; i++) 
    pq.push(arr[i]); 
while(!pq.empty()) { 
    cout << pq.top() << endl; 
    pq.pop(); 
} 
//the result may be 1, 2, 3, 4, 5 

나는이 문제를 해결할 수 있습니다 알고 난이

priority_queue<pair<int, pair<int, pair<int, string>>>> pq; 

같은 복잡한 자료 구조를 사용하고있는 문제 priority_queue 연산자 오버로딩.

간단하고 알맞은 방법은 이와 같은 연산자 오버로딩을 구현하지 않고 역 알파벳순을 구현합니다.

답변

2

어쨌든 실제 코드에서 중첩 된 쌍을 사용하여 복잡한 데이터 구조를 사용해서는 안됩니다. 그것은 코드를 이해하기 어렵게 만듭니다. pq.top().second.second.first은 무엇입니까? 당신의 구조가 복잡하다면

는 다음과 같이 원하는 회원 (그러나 의미있는 회원의 이름)를 가진 구조를 정의 :

struct datastructure 
{ 
    int member1; 
    int member2; 
    int member3; 
    std::string member4; 
}; 

그런 다음 당신은 비교 연산자를 정의해야합니다. 코드 몇 줄 밖에 없기 때문에 코드를 훨씬 쉽게 읽을 수 있습니다. 그것은 당신이 단순히 복잡한 데이터 구조의 순서를 반대로하려면

struct datastructure_comp 
{ 
    bool operator()(const datastructure &lhs, const datastructure &rhs) const 
    { 
     return lhs.member1 < rhs.member2; 
    } 
}; 

지금까지 내가 아는 한, 당신은 (대신 기본 std::lessstd::greater를 사용하는 가정 수 ... 당신이 선호하는 경우가 struct 중첩 될 수 있습니다 모든 필드는 첫 번째 필드뿐만 아니라 역순으로 비교되어야 함).

글쎄, 당신은 여전히 ​​편의를 위해 쌍을 사용하려는 경우, 당신은 그런 일 할 수있는 :

class datastructure 
{ 
    std::pair<int, std::pair<int, std::pair<int, string>>>> data; 

public: 
    int GetValue1() const { return data.first; } 
    void SetValue1(int value) { data.first = value; } 

    // other access function here... 
}; 

을 그리고 비교를 정의하는 것은 사소한 것 :

struct datastructure_comp 
{ 
    bool operator()(const datastructure &lhs, const datastructure &rhs) const 
    { 
     return lhs.data > rhs.data; // reversed sort... 
    } 
}; 
+0

은 감사하지만, 그 대답은 내가 원하지 않았다. 사용자 지정 데이터 구조 및 비교 연산자를 만드는 방법을 묻지 않았습니다. "pq.push (-arr [i])"와 같은 우선 순위 큐를 사용하여 알파벳 순 정렬 순서를 ""단순하게 ""만드는 방법에 대해 궁금합니다. 제목에 초점을 두십시오. – JunsungChoi

+1

@ JunsungChoi 그러면 데이터 구조가 단순하지 않기 때문에 간단한 방법으로 처리 할 수 ​​없습니다. – Sopel

+0

@JunsungChoi 대답 ** ** 당신이 원한다면'std :: greater'를 이미 내 대답에 언급 된대로 사용하는 것입니다. 그러나 ** 전문 개발자 **는 이해하기 어려운 코드로 3 단계의'std :: pair '를 사용하지 않을 것입니다. – Phil1970