最近刷leetcode題,使用了move()函式及優先佇列(堆)priority_queue資料結構,記錄一下!
1.move函式
move(obj)函式的功能是把obj當做右值處理,可以應用在物件的移動上,
右值參考
為了支持移動操作,新標準引入了一種新的引入型別——右值參考,所謂右值參考就是必須系結到右值的參考,通過&&而不是&來獲得右值參考,
注意,如果僅僅是定義右值參考,那么obj本身不會被移走,在作為引數時會發生obj被移走:如下:
string str = "test"; string&& r = move(str); cout<< r <<endl; cout<< str <<endl; string t(r); cout<< t <<endl; cout<< str <<endl;
運行結果:

這時候r和str都可以使用,
但是,若左值不使用右值參考,move則會銷毀變數obj,之后都不能使用它,如:
string str = "test"; string&& r = move(str); cout<< r <<endl; cout<< str <<endl; string t(move(r)); cout<< t <<endl; cout<< str <<endl;
結果為:

2.priority_queue佇列
優先佇列是一種容器配接器,采用了堆這樣的資料結構,保證了第一個元素總是整個優先佇列中最大的(或最小的)元素,
優先佇列默認使用vector作為底層存盤資料的容器,在vector上使用了堆演算法將vector中的元素構造成堆的結構,所以其實我們就可以把它當作堆,凡是需要用堆的位置,都可以考慮優先佇列,
STL 中,priority_queue 容器配接器的定義如下:
template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T> > class priority_queue{ //...... }
priority_queue 容器配接器模板類最多可以傳入 3 個引數,它們各自的含義如下:
typename T:指定存盤元素的具體型別;
typename Container:指定 priority_queue 底層使用的基礎容器,默認使用 vector 容器,(STL 序列式容器中只有 vector 和 deque 容器符合條件,)
typename Compare:指定容器中評定元素優先級所遵循的排序規則,默認使用std::less按照元素值從大到小進行排序,還可以使用std::greater按照元素值從小到大排序,但更多情況下是使用自定義的排序規則,
使用優先佇列創建大、小堆
//大根堆 priority_queue<int, std::deque<int>, std::greater<int>> values; //默認是大根堆 priority_queue<int>values; //小根堆 priority_queue<int, std::vector<int>, std::less<int>>values;
作為佇列有其佇列的成員函式
| 成員函式 | 功能 |
| empty() | 如果 priority_queue 為空的話,回傳 true;反之,回傳 false, |
| size() | 回傳 priority_queue 中存盤元素的個數, |
| top() | 回傳 priority_queue 中第一個元素的參考形式 |
| push(const T& obj) | 根據既定的排序規則,將元素 obj 的副本存盤到 priority_queue 中適當的位置, |
| push(T&& obj) | 根據既定的排序規則,將元素 obj 移動存盤到 priority_queue 中適當的位置, |
| emplace(Args&&… args) | Args&&… args 表示構造一個存盤型別的元素所需要的資料(對于類物件來說,可能需要多個資料構造出一個物件),此函式的功能是根據既定的排序規則,在容器配接器適當的位置直接生成該新元素, |
| swap(priority_queue& other) | 將兩個 priority_queue 容器配接器中的元素進行互換,需要注意的是,進行互換的 2 個 priority_queue 容器配接器中存盤的元素型別以及底層采用的基礎容器型別,都必須相同 |
| pop() | 移除 priority_queue 容器配接器中第一個元素, |
使用優先佇列,可以維護好最大/最小值;以及一些其他規則的一些比較(這個需要進行多載,目前還沒遇到),
插入堆的時間復雜度最大為O(nlogn),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541560.html
標籤:其他
