std :: search

时间:2018-03-02 10:26:59

标签: c++ c++11

在这个site上,它指出传递给std::search的二元谓词的一个约束是:

  

类型Type1和Type2必须是类型为ForwardIt1和ForwardIt2的对象可以取消引用,然后隐式转换为Type1和Type2。

但是,在C ++国际标准文档中,我看不到对这种约束的引用。我想知道这个约束是否在C ++国际标准文档中明确说明了它所属的部分。另外,如果不是,那么为什么这个约束放在std::search函数上,因为有可能有两个不同的类型,虽然不可隐式转换,但是定义了相等运算符的重载?

3 个答案:

答案 0 :(得分:6)

这是网站上的一个错误。

该参数说明填充自this template。它不区分仅被称为pred(*first1, *first2)的二进制谓词与被称为pred(*first1, *first2)pred(*first2, *first1)

的二进制谓词

进一步挖掘: 似乎this editparent template's cast req2使用enter image description here添加了一个命名参数,该参数控制是“分别”还是“分别”。 eq变体没有此新参数的直通。我没有编辑权限可以将其添加到模板和std::search

的条目中

答案 1 :(得分:3)

[algorithms.requirements]/7中列出BinaryPredicate的要求:

  

只要算法需要一个函数对象,当应用于取消引用两个相应迭代器的结果或取消引用迭代器并在BinaryPredicate是其中时键入T,就会使用T参数签名返回值为true的可测试值。换句话说,如果算法将BinaryPredicate binary_­pred作为其参数,first1first2作为其迭代器参数,它应该在构造binary_­pred(*first1, *first2)中正常工作上下文转换为bool([conv])。 BinaryPredicate始终将第一个迭代器value_­type作为其第一个参数,也就是说,在T value是签名的一部分的情况下,它应该在构造中正常工作{ {1}}上下文转换为binary_­pred(*first1, value)([转化])。 bool不应通过解除引用的迭代器应用任何非常量函数。

无需从解除引用binary_­pred构建Type1。单词' 两者'在OP的cppreference引用中是不准确的。

答案 2 :(得分:1)

好的,我终于看到了你的困惑。是由“两个”这个词的使用方式引起的。

意思应该是以下两个条件都必须为真:

  • 类型Type1必须是ForwardIt1类型的对象 取消引用,然后隐式转换为Type1

  • 类型Type2必须是ForwardIt2类型的对象可以取消引用,然后隐式转换为Type2

您将在25.2.13搜索[alg.search]:

中找到要求
  

§25.2.13搜索[alg.search]

template<class ForwardIterator1, class ForwardIterator2,
         class BinaryPredicate>
ForwardIterator1
search(ForwardIterator1 first1, ForwardIterator1 last1,
       ForwardIterator2 first2, ForwardIterator2 last2,
       BinaryPredicate pred);
     
      
  1. 返回:i范围内的第一个迭代器[first1,last1 - (last2-first2)),使得每个非负整数n小于last2 - first2   *(i + n) == *(first2 + n)以下相应条件成立:pred(*(i + n), *(first2 + n)) != falsefirst1。如果[first2, last2)为空,则返回last1,否则返回pred(*(i + n), *(first2 + n)) != false   找到了迭代器。
  2.   

相关的条件是:

pred(*(i + n), *(first2 + n))

这意味着*(i + n)有效。这意味着*(first2 + n)pred可以作为参数传递给pred。这意味着ForwardIterator1的第一个参数必须可以通过解除引用pred来构建,而ForwardIterator2的第二个参数必须可以通过解除引用function ConvertToUNCPath(AMappedDrive: string) : string; var lRemoteString : array[0..255] of char; lpRemote : PChar; lStringLen : Cardinal; begin lpRemote := @lRemoteString; lStringLen := 255; If WNetGetConnection(Pchar(ExtractFileDrive(AMappedDrive)) , lpRemote, lStringLen) = NO_ERROR Then Result := lRemoteString else Result := ''; // No mapping found end; function TDataModuleData.OpenGDBDatabase(AGDBName: string) : Boolean; var lDlgLogin: TFrmLogin; p : Integer; lUNC, lErrMsg : String; begin Result := False; with FDConnection do // TFDConnection begin Close; TxOptions.Isolation := xiDirtyRead; p := Pos(':',AGDBName); if p = 2 then begin lUNC := ConvertToUNCPath(Copy(AGDBName,1,2)); if lUNC <> '' then begin lUNC := Copy(lUNC,3); p := pos('\',lUNC); AGDBName := Copy(lUNC,p) + Copy(AGDBName,3); lUNC := copy(lUNC,1,p-1); end; end; DriverName := S_FD_IBId; Params.Database := AGDBName; if lUNC <> '' then Params.Add('Server=' + lUNC) else Params.Add('Server=localhost'); // Not strictly necessary Params.UserName := 'SYSDBA'; Params.Password := 'masterkey'; try Open; Result := Connected; except on E:Exception do begin lErrMsg := LowerCase(E.Message); end; end; end; end; 来构建。