Re: [问题] C++ 如何修改compare

楼主: poyenc (发箍)   2019-04-19 22:03:02
※ 引述《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!
作者: heardringo (love ringo)   2019-04-19 23:26:00
作者: TitanEric (泰坦)   2019-04-20 00:12:00
优文
作者: ggBird (ggBird)   2019-04-20 06:45:00
作者: bigbite (子子孙孙永保用)   2019-04-20 10:17:00
优文
作者: aa0917954358 (Doem)   2019-04-20 22:36:00
可以请教一下 overloading operator()跟operator<当作compare function的概念差在哪里吗?

Links booklink

Contact Us: admin [ a t ] ucptt.com