2012-11-27 30 views
2

可能重複:
What is predicate in C++?C++中的謂詞是什麼?

當我讀C++引物,有一個定義的術語,其是謂詞

的定義是這樣的:一個返回類型,可轉換爲bool

功能。通常由泛型算法用於測試元素。圖書館使用的謂詞是一元的(取一個參數)或二元的(取兩個)。

任何返回可以轉換爲bool的類型都可以作爲謂詞!對?或者還有其他一些限制條件。

謝謝!

+1

想象一下,你正在刪除字符串中的所有元音。通常情況下,你會做類似的操作(忽略簡單的'erase'調用)'std :: remove_if(std :: begin(str),std :: end(str),isVowel);'。在這種情況下,'isVowel'是謂詞,它需要一個字符,如果是元音則返回true。你可以將這個概念應用於這種性質的任何事物。 – chris

+2

形式上在C++中,沒有定義什麼是謂詞,它來自邏輯,用於命名來自許多C++標準庫函數的參數。就像在'InputIterator find_if(InputIterator first,InputIterator last,Predicate pred)'。順便說一句,**函數**也可以作爲與這些函數一起使用的謂詞。 –

+0

@jogojapan是的。但它已經關閉了。我想獲得更多關於它的信息。謝謝! –

回答

3

在C++(我知道無論如何)的上下文中沒有對謂詞的正式定義,但它通常意味着可以在真/假上下文中使用的函數。

下面是從cppreference一個可能實現的count_if,說明它在談論:

template<class InputIt, class UnaryPredicate> 
typename iterator_traits<InputIt>::difference_type 
    count_if(InputIt first, InputIt last, UnaryPredicate p) 
{ 
    typename iterator_traits<InputIt>::difference_type ret = 0; 
    for (; first != last; ++first) { 
     if (p(*first)) { 
      ret++; 
     } 
    } 
    return ret; 
} 

p必須返回的東西,可以在if語句的內部使用是它基本上可以歸結爲。

例如:

class T {}; 

T f(int x) 
{ 
    return T(); 
} 

這不是count_if有效的斷言,因爲T不是隱式轉換爲一個布爾值。

換句話說:

if (f(4)) { } 

是不可編譯的代碼。

但是,如果T可以被隱式轉換爲布爾值,那麼f將是一個可接受的謂詞(雖然很奇怪)。

+0

這很有用。非常感謝。 –