回答
如果您確實需要通過std::priority_queue
進行搜索並希望高效地進行搜索,則可以派生出新類並添加find
成員函數。既然你沒有添加任何額外的狀態,你不必擔心切片或其他問題,因爲std::priority_queue
不是多態。
#include <queue>
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class MyQueue : public std::priority_queue<T, Container, Compare>
{
public:
typedef typename
std::priority_queue<
T,
Container,
Compare>::container_type::const_iterator const_iterator;
const_iterator find(const T&val) const
{
auto first = this->c.cbegin();
auto last = this->c.cend();
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
};
我認爲ü需要基本的幫助。讀這可能這將幫助ü
http://comsci.liu.edu/~jrodriguez/cs631sp08/c++priorityqueue.html
-1。這不是解決問題的辦法,應該是一個評論而不是答案。 –
k先生....我新在這裏,所以這是錯誤的....我會記住下次....感謝你4關心.... – rajatV
如果你不關心性能,你可以聲明iterator
遍歷priority_queue的容器,但在C++中,底層的容器被宣佈爲protected
,無法直接訪問。
我的解決方案之一是獲取容器的迭代器是聲明一個繼承自std::priority_queue
的新類。
typedef int Val_TYPE;
typedef vector<Val_TYPE> Container_TYPE;
typedef priority_queue<Val_TYPE, Container_TYPE> pri_queue;
class Queue: public pri_queue{
public:
Container_TYPE::iterator begin(){
return pri_queue::c.begin();
}
Container_TYPE::iterator end(){
return pri_queue::c.end();
}
}Q;
然後你可以得到容器的迭代器。
Q.push(4);
Q.push(3);
Q.push(35);
for(vector<int>::iterator p=Q.begin(); p!=Q.end(); p++)
cout << *p << endl;
爲了更有效,例如尋找某些關鍵數據,你可以使用pointers to data
。
假設類Data
包含您的每項數據。 Data.key
是搜索的關鍵,Data.value
是priority_queue
中的優先。
struct Data{
VALUE_TYPE value;
KEY_TYPE key;
...
...
};
將所有數據存儲在單獨的集合中,例如數組或鏈接列表。
Data data[MAX];
定義存儲用於特定的一個data[i]
struct Node{
Data* data;
Node(Data* ptr){data=ptr;}
};
使用priority_queue
和其它數據結構中的支持的搜索即binary search tree
,hash
指針新結構。這裏我使用multimap
。
同時保持priority_queue
的Node
和multimap
的Node
。
struct cmp1{
bool operator(Node a, Node b){ return a.data->value < b.data->value; }
};
struct cmp2{
bool operator(Node a, Node b){ return a.data->key < b.data->key; }
};
priority_queue<Node, vector<Node>, cmp1> q;
multimap <KEY_TYPE, Node, cmp2> d;
for(int i = 0; i < n; ++i){
q.push(Node(&a[i]));
d.insert(a[i].key, Node(&a[i]));
}
然後,你可以使用多重映射d
數據的pointer
通過鍵搞定。通過使用priority_queue q
也滿足對priority_queue的需求。
以上所有僅僅是使用指針。
你不需要包括比較功能。對於'map'和'priority_queue',模板參數默認爲'std :: less' –
@CaptainObvlious也許你不理解我。我的意思是使用'priority_queue'和'multimap'來存儲數據的'指針'。所以我需要編寫自己的比較函數。 – konjac
使用兩個容器是不必要的,即使您執行比較函數也會導致它們的排序不同。將比較函數移動到'Node'中,並且您有一個不太明確的依賴關係來處理。在Data中存儲鍵和值都是不必要的,它已經由容器管理。你最好寫自己的容器適配器。 –
- 1. 列表到優先隊列
- 2. 在Python中尋找優先級隊列中的值
- 3. 優先級隊列中的優先級
- 4. 在優先級隊列(堆)中尋找最小值
- 5. 優先級隊列
- 6. 優先隊列C++
- 7. 如何在Python中創建唯一的值優先級隊列?
- 8. SQL中的優先隊列
- 9. Java中的優先隊列?
- 10. Java中的優先隊列
- 11. 優先級隊列在python
- 12. 我們可以在優先隊列中使用字符值嗎?
- 13. 如何將java優先級隊列轉換爲C++優先級隊列?
- 14. 從陣列到優先級隊列
- 15. 此優先級隊列如何工作?
- 16. 優先隊列插入鍵值對java
- 17. java優先級隊列隊列適應
- 18. 優先級隊列VS隊列
- 19. 在Kannel中實現優先隊列
- 20. 在芹菜中的多個隊列中優先隊列?
- 21. 如何在JAVA中創建高優先級有界子隊列和低優先級有界子隊列
- 22. PHP優先隊列實現
- 23. 優先隊列堆實現
- 24. Java優先隊列錯誤
- 25. Java優先級隊列
- 26. PHP Sendmail隊列優先級
- 27. 雙重優先級隊列
- 28. Objective-c優先級隊列
- 29. 優先級隊列,可比
- 30. 優先隊列矛盾
沒有任何代碼?不錯的嘗試... – 2013-05-25 12:50:21
「priority_queue」只定義了2個操作:按給定的優先級插入,並檢索具有最高優先級的項目。如果你需要其他的東西,'priority_queue'不是合適的容器。 – syam
這將有助於瞭解您需要做什麼 - 優先隊列的整體目的通常是您不需要此操作。 –