Re: [問題] C++ 如何修改compare

看板C_and_CPP (C/C++)作者 (髮箍)時間6年前 (2019/04/19 22:03), 6年前編輯推噓6(601)
留言7則, 5人參與, 6年前最新討論串2/3 (看更多)
※ 引述《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
可以請教一下 overloading operator()跟operator<
04/20 22:36, 5F

04/20 22:36, 6年前 , 6F
當作compare function的概念差在哪裡嗎?
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
文章代碼(AID): #1SkTKY-K (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1SkTKY-K (C_and_CPP)