C++ STL概念是否涵盖STL算法的所有参数要求?

C++ STL概念是否涵盖STL算法的所有参数要求?,c++,algorithm,stl,c++-concepts,callable-object,C++,Algorithm,Stl,C++ Concepts,Callable Object,查看某些算法的模板名称时, 我看到这个名称对应于一个库概念 比如说 template< class InputIt1, class InputIt2, class BinaryPredicate > std::pair<InputIt1,InputIt2> mismatch( InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p); template

查看某些算法的模板名称时,
我看到这个名称对应于一个库概念

比如说

template< class InputIt1, class InputIt2, class BinaryPredicate >
std::pair<InputIt1,InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
          InputIt2 first2,
          BinaryPredicate p);
template
std::pair
不匹配(InputIt1 first1,InputIt1 last1,
输入2 first2,
二元谓词p);
它接受一个
二进制谓词
,它也是一个


但看看其他算法,我发现:

  • 一元谓词
  • 一元函数
  • 一元运算
  • 二进制运算
它们没有相应的概念

他们被排除在外有什么原因吗?

这些概念是通过结合已有的概念而导出的吗?

< P> C++标准没有定义“概念”。它对“要求”的定义如下:

但有些需求使用的语法与其他需求不同。例如,
allocator
swappable
使用小写斜体(allocator),我的示例列表中的其他字体使用camelcase单空格字体,或者,如标准中所述,使用类型常量(
EqualityComparable

其他“概念”,如
PODType
,在本标准中仅作为定义处理


例如,
BinaryPredicate
既不是概念也不是定义;正如使用它的函数的模板名称一样:

void unique();
template <class BinaryPredicate> void unique(BinaryPredicate pred);
void unique();
模板void unique(二进制谓词pred);
效果:从引用的每个连续相等元素组中删除除第一个元素以外的所有元素 由迭代器
i
[第一个+1,最后一个)
范围内执行,其中
*i==*(i-1)
(对于没有 参数)或
pred(*i,*(i-1))
(对于具有谓词参数的版本)保持有效。无效 只有迭代器和对已擦除元素的引用

抛出:除非相等比较或谓词抛出异常,否则为空

复杂度:如果范围
[first,last)
不为空,则正好是应用程序的
(last-first)-1
对应的谓词,否则不应用该谓词


如您所见,
BinaryPredicate
没有定义。它只是显示了它如何影响
std::unique
的行为


另一方面,概念列表是从概念提案中提取出来的,这是非标准的。此外,
cppreference
并不完美,从概念提案的角度来看,并不是每个wiki页面都是完整或完整的,还有其他模板参数甚至没有出现在标准中,如
UnaRyTrace< /Calp> .< /P> CPORID记录了其中的一些,而不是其他的。我认为您是在过度思考。<代码> unay-谓词< />看起来至少是<代码>谓词< /> >的同义词。<代码> BinaryPredicate <代码>是在实际C++标准中使用和定义的术语/类型名称(见第25.1节第9段)。但是,标准中从未出现术语
UnaryPredicate
UnaryFunction
BinaryOperation
UnaryOperation
在标准中使用,但没有像
BinaryPredicate
那样明确定义。该页面上的参考列表“C++规范的规范文本中使用的命名要求”,而不是概念(实际范围)建议中的命名要求。
void unique();
template <class BinaryPredicate> void unique(BinaryPredicate pred);