你可以給一些例子或一個主題的鏈接。什麼是C++中的謂詞?
回答
Predicate是一個C++函數,返回布爾型或具有bool operator()成員的對象實例。 元謂詞采取一個agrument,二 - 二,等問題謂詞可以回答特定算法 的例子是:
- 這是什麼元素,我們正在尋找?
- 是我們訂單中第一個排序的第一個參數嗎?
- 兩個參數是否相等?
幾乎所有的STL algorithms都以謂詞作爲最後一個參數。
您可以使用標準,自己的和謂詞製作類(here is a good reference)構造新的謂詞。
謂詞不一定是函數,然後可以代替函子。至少就標準算法而言,它們不必返回'bool'或具有'bool()'的操作符,它可以返回可測試爲true或false的任何內容。因此,轉換爲「bool」的內置類型(例如指針)也可以。 – 2011-05-07 15:52:54
謂詞只是一個函數,它根據其輸入是否滿足某些條件返回true或false。一般來說,謂詞函數應該是純;它應該總是給定相同的輸入時返回相同的結果(因此bool isDateInPast(Date &date)
將是一個不好的謂詞)。
它們經常用於,例如,作爲用於STL回調排序例程(即,「是輸入a
小於輸入b
?」)。
該鏈接表示它也必須是*一元*函數。 – 2011-05-07 14:25:54
@Simon:是的,這不是一個非常普遍的聯繫。我會從我的答案中刪除它。 – 2011-05-07 14:26:44
通常在STL *搜索例程中使用謂詞,例如, 'copy_if'。是的,他們是一元的。排序功能不被視爲謂詞。 – 2011-05-07 14:41:29
它並不特定於C++(甚至計算機語言)。在自然語言語法中,在諸如的大門打開,開放部分是謂語並且是真或假,所以說你有一個類cGate
,與一個成員函數bool cGate::isOpen()
,這樣一個函數將是一個謂詞。
本質上,如果函數詢問有關對象狀態或值的問題,並且結果爲true或false,則它是謂詞。
C++標準定義Predicate
如下(25/7):
的謂詞參數用於 每當的算法預計,當施加到 解引用 對應迭代的結果的 功能對象返回值爲 可測試爲true。換句話說,如果 算法將Predicate pred作爲 其參數並且首先作爲其迭代器 參數,則它應該在 構造
if (pred(*first)){...}
中正確工作。 函數對象pred
不應該 通過解除引用的迭代器應用任何非常量函數 。 該函數對象可能是一個指針 來運行,或者一個類型爲 的對象與適當的函數調用 運算符。
有兩個參數BinaryPredicate
的類似定義。因此,在英語
,它是一個函數或用operator()
過載的對象,即:
- 接受一個參數。在算法的情況下,參數類型可以從所討論算法的解除引用迭代器的類型隱式轉換,或者是對這種類型的常量引用,或者在推動時它可以是非常量引用只要迭代器不是const_iterator即可。
- 返回一個值,該值可以在
if
語句(因此也是因爲C++的語言規則,也在while
循環等中)中針對真值進行測試。 - 不修改其參數(至少,只要不是參數類型是const的,正確的...)
此外,由於許多算法沒有規定操作的確切順序執行這些,如果你的謂詞不一致,你可能會發現你會得到不可預知的行爲,也就是說,如果結果取決於除了可能在不同調用之間改變的輸入值以外的其他值。
除算法外,<functional>
中的邏輯否定器not1
採用Predicate
模板參數。在這種情況下,有一個額外的需求(20.3/5):
爲了使適配器與其它 部件操縱功能 對象採取一個或兩個參數 它要求該功能 對象相應地提供 對於採用兩個 參數的函數對象,對於帶有一個參數 參數和first_argument_type, second_argument_type和result_type 的函數對象,typedefs argument_type和result_type 。
- 1. 什麼是C#中的謂詞?
- 2. C++中的謂詞是什麼?
- 3. 什麼是謂詞檢查?
- 4. 什麼是LISP中的宏的謂詞
- 5. 什麼是電流()的謂詞
- 6. 什麼是「基於謂詞的搜索」?
- 7. 不連續謂詞是什麼意思?
- 8. C++ is_str_empty謂詞
- 9. C#中的謂詞代表
- 10. s()謂詞在Prolog中做什麼?
- 11. Prolog中的謂詞「simple/1」是什麼意思(SWI-Prolog)
- 12. Mercurial修訂集中contains()謂詞的用途是什麼?
- 13. Prolog中失敗謂詞的用法是什麼?
- 14. C++中push_back的詞源是什麼?
- 15. 使用基於另一個謂詞的謂詞的謂詞過濾數組,這是謂詞的關鍵
- 16. C#:爲什麼LinkedList沒有帶謂詞的RemoveAll方法?
- 17. 問題的謂詞在C#
- 18. 爲什麼這個Prolog謂詞有效?
- 19. 什麼將快速干預謂詞?
- 20. 有什麼方法來否定謂詞?
- 21. 查找匹配的謂詞。謂詞的謂詞?
- 22. iOS UIAutomation腳本:引用鍵盤的正確謂詞是什麼?
- 23. 命名謂詞函數的最佳方式是什麼?
- 24. 這個素數相關謂詞的瓶頸是什麼?
- 25. C++中術語「詞法」是指什麼?
- 26. STL謂詞是否必須是純謂詞?
- 27. LINQ中的謂詞
- 28. prolog中的謂詞
- 29. C++ std :: sort類中的謂詞函數
- 30. c中的泛型和謂詞#
我不想繼續這樣做,但你有沒有Google搜索「C++謂詞」? – YXD 2011-05-07 14:16:06
@Mr E:關於Stack Overflow的好處是,越來越多的谷歌在編程相關問題上的搜索鏈接到這裏。如果這些問題在這裏沒有得到解答,那就永遠不會發生,所以SO永遠不會達到臨界質量。所以「谷歌它」永遠不會是一個令人滿意的答案。 – Clifford 2011-05-07 14:27:57
取決於。同意Google的能力,但我從來沒有覺得SO應該成爲基本語言參考的替代品。也很高興看到問這個問題的人花費了很少的精力找到答案,以便他們能指出他們在理解時遇到的困難。對此有不同的意見:http://meta.stackexchange.com/questions/33376/is-it-bad-to-ask-google-searchable-questions-on-stack-overflow http://meta.stackexchange。 com/questions/8724/how-to-deal-with-google-questions – YXD 2011-05-07 14:39:53