2017-01-15 4 views
0
template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;  

첫 번째 템플릿 인수는 우선 순위 큐에 저장되는 요소의 데이터 형식이고 두 번째 인수는 프로그래머가 사용하려는 컨테이너의 종류입니다. deque 또는 벡터.우선 순위 큐의이 템플릿 서명을 어떻게 해석합니까?

하지만 세 번째 주장은 나 같은 것을 본 적이 없기 때문에 조금 혼란 스럽습니다. 이 우선 순위 큐에 필요한 엄격한 약한 순서를 기준으로 할 수있는 뭔가가 있나요

template <class T, class Container = vector<T> 
class priority_queue{ 
    /* Implementation */ 
}; 

: 나는 같은 짓을 한 것? 그렇다면 어떻게 더 배울 수 있습니까? 세 번째 인수를 사용하는 예를 들려 주시겠습니까?

저는 템플릿 프로그래밍에 익숙하지 않으므로 도움을 주시면 감사하겠습니다.

+1

우선 순위를 결정하기 위해 대기열의 내용을 비교하는 방법을 지정합니다. 기본적으로 std :: less를 사용합니다. –

+0

첫 번째와 두 번째 및 세 번째 인수는 본질적으로 동일합니다. 정확히 무엇을 이해하지 못합니까? 당신은 https://www.bing.com/search와 같은 것을 분명히 검색했기 때문에?q = c % 2B % 2B + priority_queue + what + is + compare + 이미 사용법의 예를 보았습니다. 이유는 무엇입니까? –

+0

@Alexei 같은 방법? –

답변

1

세 번째 매개 변수는 비교기 클래스를 지정합니다.

비교기 클래스는 대기열 순서를 결정하기 위해 대기열 요소를 비교합니다. 대기열의 요소가 먼저 "높은"값으로 정렬된다는 것을 이미 알고 있습니다. 음, 이것은 "더 높은"의미를 정의하는 것입니다.

비교기 클래스는 두 개의 값이 주어지면 첫 번째 값이 두 번째 값보다 작 으면 true을 반환하고 그렇지 않으면 false을 반환합니다. 기본 구현 인 std::less은 기존 < 연산자를 사용하여 두 값을 비교합니다.

우선 순위 큐의 동작을 변경하려면 사용자 지정 비교기 클래스를 사용하십시오. 한 예는 std::less 대신 std::greater을 비교기 클래스로 지정하는 것입니다. std::greater> 연산자를 사용하므로 "반대 순서로"우선 순위 큐가 만들어 지므로 가장 높은 값이 아니라 가장 낮은 값이 먼저 제공됩니다.

또는, 같은 사용자 정의 비교 클래스를 만들 수 있습니다

class last_four_bits { 

public: 

    bool operator()(int a, int b) const 
    { 
      return (a & 0x0F) < (b & 0x0F); 
    } 
}; 

이 비교기 클래스는 단지 int의 적어도 4 개 비트를 비교합니다. 큐의 각 int 값의 최소 4 비트에서

std::priority_queue<int, std::vector<int>, last_four_bits> 

보면, 따라서 낮은 값으로 사람 전에 마지막 4 비트에 가장 높은 값을 가진 모든 int의 주문이, 차례로,이 있습니다 int의 다른 모든 비트는 무시됩니다.

P. Comparator 클래스는 연관 컨테이너 인 setmap과 함께 사용되며 동일한 함수를 제공합니다. 비교기 클래스를 신중하게 작성하면 반복자가 세트/맵의 키에 대해 가장 낮은 키부터 가장 높은 키 이외의 순서로 반복 할 수 있습니다 (본질적으로 "최저"및 "최고"를 이해함) .