2017-12-18 125 views
5

Tôi muốn làm điều này:Làm thế nào để sử dụng một STL priority_queue + so sánh với một nhà xây dựng cụ thể?

#include <queue> 
#include <set> 

class Comparator 
{ 
    public: 
    Comparator(SomeObject& rTool) : mrTools(rTool) {} 

    bool operator()(const std::string& a, const std::string& b) 
    { 
     return mrTools.doSomething(a,b); 
    } 

    private: 
    SomeObject& mrTools; 
} 

std::priority_queue<std::string, std::set<std::string>, Comparator> queue; 
//<- this doesn't compile 

Làm thế nào tôi có thể initalize hàng đợi này cung cấp sánh với các tài liệu tham khảo cần thiết trong các nhà xây dựng?

Trả lời

1

Điều này không liên quan gì đến số Comparator của bạn và mọi thứ cần làm với std::set không thỏa mãn các yêu cầu của SequenceContainer. Bạn có thể sử dụng vector hoặc deque, hoặc viết riêng SequenceContainer của bạn, đảm bảo để thực hiện front, push_backpop_back, và có iterator s mà RandomAccessIterator

4

Bạn có thể cung cấp một thể hiện của Comparator để xây dựng nó; nếu không, Comparator() sẽ được sử dụng làm đối số mặc định cho constructor of std::priority_queue, nhưng Comparator không có hàm tạo mặc định. ví dụ.

SomeObject so; 
std::priority_queue<std::string, std::set<std::string>, Comparator> queue(Comparator(so)); 

BTW: std::set không đáp ứng các yêu cầu của container cơ bản của std::priority_queue. Thay vào đó, bạn có thể sử dụng std::vector hoặc std::deque.

Loại thùng chứa cơ bản để sử dụng để lưu trữ các phần tử. Hộp chứa phải đáp ứng các yêu cầu của SequenceContainer và các trình lặp vòng của chúng tôi phải đáp ứng các yêu cầu của RandomAccessIterator. Ngoài ra, nó phải cung cấp các chức năng sau với ngữ nghĩa thông thường:

  • trước()
  • push_back()
  • pop_back()

Các container tiêu chuẩn std::vectorstd::deque đáp ứng những Yêu cầu .

+0

Một 'priority_queue' có ít chức năng hơn' bộ'. Lý do duy nhất (nhưng có thể rất tốt) để ưu tiên 'priority_queue' là hiệu quả. –

Các vấn đề liên quan