2016-10-23 20 views
1

查看某些算法的模板名稱時,我看到該名稱對應於一個庫概念。STL概念是否涵蓋了STL算法的所有參數要求?

std::mismatch爲例。

template< class InputIt1, class InputIt2, class BinaryPredicate > 
std::pair<InputIt1,InputIt2> 
mismatch(InputIt1 first1, InputIt1 last1, 
      InputIt2 first2, 
      BinaryPredicate p); 

它需要一個BinaryPredicate這也是一個library concept


其他算法看,雖然,我看到:

  • UnaryPredicate
  • UnaryFunction
  • UnaryOperation
  • BinaryOperation

,他們沒有相應的概念。

他們有被遺漏的原因嗎?
這些概念是否可以通過結合現有概念推導出來?

+0

cppreference記錄了其中的一些,而不是其他人。我認爲你正在推翻它。 –

+0

'UnaryPredicate'似乎至少是'Predicate'的同義詞。 – StoryTeller

+1

'BinaryPredicate'是在實際的C++標準中使用和定義的術語/類型名稱(參見[本草案]第25.1節第9段)(http://www.open-std.org/jtc1/sc22/wg21/文檔/文件/ 2013/n3690.pdf))。但是,標準中不會出現「UnaryPredicate」和「UnaryFunction」這兩個術語。標準中使用'BinaryOperation'和'UnaryOperation',但沒有像BinaryPredicate那樣明確定義。 – Cornstalks

回答

1

C++標準沒有定義「概念」。它定義了「requirementes」like:

EqualityComparable, LessThanComparable, DefaultConstructible, 
MoveConstructible, CopyConstructible, MoveAssignable, CopyAssignable, 
Destructible, NullablePointer, Hash, TrivialClock, Allocator, 
Swappable or Container 

但是有些要求使用不同於其他語法的語法。例如,allocatorswappable使用小寫斜體(分配器),和其他人從我的樣本列表中駝峯寬字體,或者,如在標準中描述的,用恆定類型(EqualityComparable)。

其他「概念」,如PODType,在標準中被視爲定義。

例如,BinaryPredicate未被定義爲概念或定義;只是作爲功能的模板名稱使用它:

void unique(); 
template <class BinaryPredicate> void unique(BinaryPredicate pred); 

影響:擦除所有而是從由迭代i中的量,範圍[first + 1,last)稱爲 相等的元素的每個連續組的第一個元素*i == *(i-1)(對於沒有 參數的版本)或pred(*i, *(i - 1))(對於具有謂詞參數的版本)成立。僅對迭代器和對已擦除元素的引用使 無效。

拋出:除非通過相等比較或謂詞拋出異常,否則什麼也不做。

複雜度:如果範圍[first,last)不爲空,則應用恰好對應的謂詞,否則沒有應用謂詞。

如您所見,未定義BinaryPredicate。它只是顯示它如何影響std::unique的行爲。

另一方面,cppreference概念列表是從概念提取的,這是非標準的。此外,cppreference並不完美,從概念提案的角度來看,並非每個wiki頁面都是完整的或完整的描述,還有其他模板參數甚至不出現在標準中,如UnaryOperator

+0

該頁面上的Cppreference列表具有「在C++標準的規範文本中使用的命名要求」,而不是來自概念(實際範圍)提案的那些。 – Cubbi