我知道标准库有std::reverse_iterator<...>
,给定迭代器类型,可以用它来获取它的反向(类型)。
它是否也有类似的机制来反转用于排序/排序的比较器?采用比较器类型并产生对应于相反顺序的比较器(假设顺序是可逆的)?例如
std::reverse_comparator<std::greater<int>>
等同于std::less<int>
?
答案 0 :(得分:4)
C ++ 17引入了std::not_fn
,std::greater<int>
将“替换” std::less_equal<int>
。
这不是std::sort
/ std::map
的正确比较器。
另外在std中,我认为它不存在“转换”到std::less<int>
的那个,但你可以轻松编写自己的,例如:
template <typename Comparer>
struct InvComparer
{
public:
explicit InvComparer(Comparer comparer) : comp(comparer) {}
template <typename T1, typename T2>
bool operator() (const T1& lhs, const T2& rhs) const { return comp(rhs, lhs); };
private:
Comparer comp;
};
答案 1 :(得分:1)
有not2
,它会生成输入函子的二进制补码。但是,std::greater<T>
的补码不等于std::less<T>
,而std::less_equal<T>
不是大多数标准算法的有效比较器。 C ++ 17将引入一个与非二元仿函数一起使用的泛型not_fn
。
std::less<T>
没有开箱即用的解决方案 - &gt; std::greater<T>
但应该可以实施。也许:
template<class Pred>
auto
fancy_not2(Pred&& pred) {
return [pred=std::forward<Pred>(pred)](auto&& left, auto&& right){
return left != right
&& !pred(std::forward<decltype(left)>(left),
std::forward<decltype(right)>(right));
};
}