2013-03-24 48 views
5

Làm thế nào chúng ta có thể sử dụng STL priority_queue cho cấu trúc? Bất kỳ minh họa nào đang đẩy & popping, trong đó cấu trúc có nhiều loại dữ liệu?
Nói: struct thing { int a; char b;} glass[10];.
Bây giờ làm thế nào tôi có thể đặt cấu trúc này trên priority_queue bằng cách sử dụng 'int a' cho đặt hàng?stl priority_queue của C++ với struct

Trả lời

12

Đây là câu trả lời được sửa đổi đôi chút cho your original question, which you deleted không có lý do rõ ràng. Bản gốc chứa đủ thông tin để bạn tìm ra điều này, nhưng ở đây nó đi: cung cấp ít hơn so sánh sử dụng số int để so sánh.

Tất cả những gì bạn cần làm là cung cấp hàm functor thực hiện so sánh ít hơn với thứ tự yếu nghiêm ngặt hoặc toán tử nhỏ hơn cho lớp của bạn thực hiện tương tự. struct này đáp ứng các yêu cầu:

struct thing 
{ 
    int a; 
    char b; 
    bool operator<(const thing& rhs) const 
    { 
     return a < rhs.a; 
    } 
}; 

sau đó

std::priority_queue<thing> q; 
thing stuff = {42, 'x'}; 
q.push(stuff); 
q.push(thing{4242, 'y'}); // C++11 only 
q.emplace(424242, 'z'); // C++11 only  
thing otherStuff = q.top(); 
q.pop(); 
+0

Cảm ơn^_^ & chỉ 1 điều cuối cùng: làm thế nào tôi sẽ thúc đẩy nói (3, a) đến hàng đợi direclty? tôi không biết làm thế nào để đặt (3, a) để 'thứ thứ = ** ... **'. –

+0

Trong C++ 11, bạn có thể nói 'q.push (điều {42, 'x'})' hoặc 'q.emplace (42, 'x')'. Nếu bạn không có hỗ trợ C++ 11, bạn cần cung cấp cho 'thing' một hàm tạo. – juanchopanza

4

quá tải < điều hành cho thing:

struct thing 
{ 
    int a; 
    char b; 

    bool operator<(const thing &o) const 
    { 
     return a < o.a; 
    } 
}; 

priority_queue<thing> pq; 

thing t1, t2, t3; 

// ... 

pq.push(t1); 
pq.push(t2); 

// ... 

t3 = pq.top(); 
pq.pop(); 
2

Bạn cần phải thực hiện một so sánh chức năng hoặc quá tải toán tử nói với hàng đợi ưu tiên trên thứ tự bạn muốn sắp xếp dữ liệu tùy chỉnh của mình. Khi hàng đợi ưu tiên sẽ sắp xếp dữ liệu của bạn thì nó sẽ cần một cách để biết cách so sánh giữa chúng. Bạn phải xác định điều này bằng cách chuyển một hàm tới hàng đợi ưu tiên hoặc toán tử nạp chồng trong lớp hoặc cấu trúc dữ liệu tùy chỉnh của bạn.

Bạn có thể kiểm tra câu trả lời this. This có thể giúp bạn. Tôi đã cố gắng giải thích nhiều cách sử dụng hàng đợi ưu tiên cho các loại dữ liệu tùy chỉnh.