标准库是否有比较器反转机制?

时间:2017-01-27 09:27:08

标签: c++ templates iterator comparator c++-standard-library

我知道标准库有std::reverse_iterator<...>,给定迭代器类型,可以用它来获取它的反向(类型)。

它是否也有类似的机制来反转用于排序/排序的比较器?采用比较器类型并产生对应于相反顺序的比较器(假设顺序是可逆的)?例如 std::reverse_comparator<std::greater<int>>等同于std::less<int>

2 个答案:

答案 0 :(得分:4)

C ++ 17引入了std::not_fnstd::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;
};

Demo

答案 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));
    };
}