2011-05-07 33 views
24

你可以給一些例子或一個主題的鏈接。什麼是C++中的謂詞?

+20

我不想繼續這樣做,但你有沒有Google搜索「C++謂詞」? – YXD 2011-05-07 14:16:06

+45

@Mr E:關於Stack Overflow的好處是,越來越多的谷歌在編程相關問題上的搜索鏈接到這裏。如果這些問題在這裏沒有得到解答,那就永遠不會發生,所以SO永遠不會達到臨界質量。所以「谷歌它」永遠不會是一個令人滿意的答案。 – Clifford 2011-05-07 14:27:57

+1

取決於。同意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

回答

33

Predicate是一個C++函數,返回布爾型或具有bool operator()成員的對象實例。 元謂詞采取一個agrument,二 - 二,等問題謂詞可以回答特定算法 的例子是:

  • 這是什麼元素,我們正在尋找?
  • 是我們訂單中第一個排序的第一個參數嗎?
  • 兩個參數是否相等?

幾乎所有的STL algorithms都以謂詞作爲最後一個參數。

您可以使用標準,自己的和謂詞製作類(here is a good reference)構造新的謂詞。

+11

謂詞不一定是函數,然後可以代替函子。至少就標準算法而言,它們不必返回'bool'或具有'bool()'的操作符,它可以返回可測試爲true或false的任何內容。因此,轉換爲「bool」的內置類型(例如指針)也可以。 – 2011-05-07 15:52:54

7

謂詞只是一個函數,它根據其輸入是否滿足某些條件返回true或false。一般來說,謂詞函數應該是;它應該總是給定相同的輸入時返回相同的結果(因此bool isDateInPast(Date &date)將是一個不好的謂詞)。

它們經常用於,例如,作爲用於STL回調排序例程(即,「是輸入a小於輸入b」)。

+0

該鏈接表示它也必須是*一元*函數。 – 2011-05-07 14:25:54

+0

@Simon:是的,這不是一個非常普遍的聯繫。我會從我的答案中刪除它。 – 2011-05-07 14:26:44

+0

通常在STL *搜索例程中使用謂詞,例如, 'copy_if'。是的,他們是一元的。排序功能不被視爲謂詞。 – 2011-05-07 14:41:29

5

它並不特定於C++(甚至計算機語言)。在自然語言語法中,在諸如的大門打開開放部分是謂語並且是真或假,所以說你有一個類cGate,與一個成員函數bool cGate::isOpen(),這樣一個函數將是一個謂詞。

本質上,如果函數詢問有關對象狀態或值的問題,並且結果爲true或false,則它是謂詞。

7

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 。