Re: [問題] C++ 如何修改compare
※ 引述《a29831968 (yeah is you)》之銘言:
: 開發平台(Platform): (Ex: Win10, Linux, ...)
: 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: 問題(Question):
: 餵入的資料(Input):
: 預期的正確結果(Expected Output):
: 錯誤結果(Wrong Output):
: 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
: 不好意思,我是在刷題的時候遇到問題
: 可能關鍵字下錯所以一直找不太到答案,所以想在這裡求助大神
: 一般來說
: 定義 priority_queue<>時,第三個參數放的是compare
: 在刷題時,模板是這樣子
: class solution{
: // 裡面會有題目自訂的funciton
: // 若是我在題目內宣告priority_queue,且要用到符合需求的compare時,
: // 我會在該class外面自行定義
: vector<int> mergeTwoSortedArray(vector<int> a, vector<int> b) {
: // 隨便假設
: priority_queue<int, vector<int>, compare> pq;
: }
: };
: // ex
: class compare{
: bool operator()(const int &a, const int &b) {
: return a > b;
: }
: };
: 可是我現在需要在class solution題目給的function內去更改compare,
: 因為我需要使用到題目給的input,不單單只是整數,說不定要用到a的size之類的(假設)
: 補充說明(Supplement):
: 抱歉,第一次發文,若有什麼不妥或不符合規定請告知,會改進
: 謝謝各位的幫忙。
除了語法問題, 小弟來補充一下你可能不知道的二三事, 通常
STL algorithms/containers 使用你給的 function objects 時都
會有以下常見的需求:
1. consistent behavior
2. copy constructible
3. stateless
4. callable by given arguments
第一點很合理, 假如我現在寫了自己的 less 比較兩個整數, 前 10
次呼叫 less{}(1, 2) 會回傳 true, 但第 11 次開始回傳 false,
想當然拿來當排序準則是會失敗的:
https://bit.ly/2VbG9m2
第二點在該 algorithm/container 使用期間, 你給的 function
object 必須一直存活著, 所以通常介面會用 const T& 來接你給的
物件引數, 而它們會複製一份在內部使用, 這個通常在規格書或
cppreference 找得到:
http://eel.is/c++draft/priority.queue#priqueue.cons
第三點比較像是前兩點的綜合, 因為會複製資料成員(複製狀態),
在 algorithms/containers 內部使用時可能行為就變掉不如預期
第四點要先知道給的物件會被怎樣使用, 不然會得到一大坨編譯錯
誤不知道該怎麼辦, 也是文件就找得到:
https://bit.ly/2GmpPpf
因為 std::priority_queue 類別模版接的都是型別引數, 所以你
需要在編譯的時候想辦法推導出來. 就我所知有兩種方法給你參考:
其中一種是自訂型別, 提供多載 operator(); 另一種是先用
lambda expression 建立 closure, 再透過 decltype() 得到它的
型別, 當作引數傳給 std::priority_queue 類別模版
方法一 https://bit.ly/2vcOIOV
方法二 https://bit.ly/2L4ucen
happy coding!
--
P1389R0: Guidelines for Teaching C++ to Beginners
https://bit.ly/2GvDWKb
SG20 Education and Recommended Videos for Teaching C++
https://www.cjdb.com.au/sg20-and-videos
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 150.116.41.131
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1555682594.A.F94.html
推
04/19 23:26,
6年前
, 1F
04/19 23:26, 1F
推
04/20 00:12,
6年前
, 2F
04/20 00:12, 2F
推
04/20 06:45,
6年前
, 3F
04/20 06:45, 3F
推
04/20 10:17,
6年前
, 4F
04/20 10:17, 4F
推
04/20 22:36,
6年前
, 5F
04/20 22:36, 5F
→
04/20 22:36,
6年前
, 6F
04/20 22:36, 6F
好問題! 除非你是直接指定函式的位址, 不然差別在於決定呼叫對
象的時機. 假設我有一個 template function, 做的事只有印出兩
個參數用 operator<() 比較的結果:
template <typename T>
void test(const T& lhs, const T& rhs) {
std::cout << std::boolalpha << (lhs < rhs) << std::endl;
}
在模版被具現化 (instantiate) 以前, 還不會決定叫用的函式, 但
是當觸發具現化或做全特化 (full specialization) 時, 就需要找
個可用 operator<() 函式實體來呼叫, 這時候就看當下情境有哪些
選項讓編譯器挑. 你可以參考下面的範例:
https://bit.ly/2Gpc6hp
這個在分離編譯的時候, 常因為編譯器看到的運算子對象不同造成
混淆, 所以通常類別的實作者都會提供預設的 operator<() 實作放
在同一個命名空間下, 並且藉助 ADL (Argument Dependent Lookup
) 讓編譯器能找到同一個對象. 只不過這個預設的運算子合不合用
就要看個別使用情境了
另一方面如果直接指定一個 function object 就不需要後續查找函
式的流程 (如果沒有像 std::less 間接查找的話)
※ 編輯: poyenc (150.116.41.131), 04/21/2019 08:14:26
推
04/21 21:17,
6年前
, 7F
04/21 21:17, 7F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章