2

看这个例子(来自cppreference):

#include <algorithm>
#include <vector>
#include <iostream>

 struct S
 {
     int number;
     char name;
     // note: name is ignored by this comparison operator
     bool operator< ( const S& s ) const { return number < s.number; }
 };

 int main()
 {
     // note: not ordered, only partitioned w.r.t. S defined below
     const std::vector<S> vec = { {1,'A'}, {2,'B'}, {2,'C'}, {2,'D'}, {4,'G'}, {3,'F'} };

     std::cout << "\n" "Using heterogeneous comparison: ";
     struct Comp
     {
         bool operator() ( const S& s, int i ) const { return s.number < i; }
         bool operator() ( int i, const S& s ) const { return i < s.number; }
     };

     const auto p2 = std::equal_range(vec.begin(),vec.end(), 2, Comp{});

     for ( auto i = p2.first; i != p2.second; ++i )
         std::cout << i->name << ' ';
 }

如果我想在中使用结构,是否需要以如下两种方式重载运算符 () 以用于仿函数std::equal_range

PS:这是this one的后续问题equal_range如何利用异构比较?,显然其中一个问题太多了,因此我将其拆分为仅询问此处的两个重载。

4

2 回答 2

2

cppreference关于std::equal_range

返回一个范围,其中包含与范围 [first, last) 中的 value 等效的所有元素。

a和之间的等价性b由 确定!comp(a,b) && !comp(b,a)

因此,当value是 anint并且与范围内元素的类型不同时,这两种变体都是必需的。请注意,如果S有一个转换构造函数 fromint或 someS{value,dummy_char}将被传递给std::equal_rangeasvalue则首先不需要比较器,但<可以使用默认比较 via。

于 2022-01-14T12:30:58.350 回答
1

引用自cppreference

谓词函数的签名应等同于以下内容:

bool pred(const Type1 &a, const Type2 &b);

虽然签名不需要 const &,但该函数不得修改传递给它的对象,并且必须能够接受所有类型的值(可能是 const)Type1 和 Type2,而不管值类别如何(因此,不允许使用 Type1 & , Type1 也不是,除非 Type1 的移动等价于副本 (C++11 起))。类型 Type1 和 Type2 必须使得 T 类型的对象可以隐式转换为 Type1 和 Type2,并且 ForwardIt 类型的对象可以取消引用,然后隐式转换为 Type1 和 Type2。

因此,只要您的类型满足这些要求,就只需要一个功能。

于 2022-01-14T12:28:06.267 回答