11

标准算法minmax可以与单个值进行比较。但是,minmax算法返回值不能与一对值进行比较:

#include <algorithm>
#include <utility>

template<class T1, class T2>
constexpr auto make_cref_pair(T1&& t1, T2&& t2)
{
    return std::pair<T1 const&, T2 const&>(std::forward<T1>(t1), std::forward<T2>(t2));
}

int main()
{
    static_assert(std::min(2, 1) == 1); // OK
    static_assert(std::max(2, 1) == 2); // OK
    //static_assert(std::minmax(2, 1) == std::make_pair(1, 2)); // ERROR, const int& vs int pair comparison
    static_assert(std::minmax(2, 1) == std::pair<const int&, const int&>(1, 2)); // OK
    static_assert(std::minmax(2, 1) == make_cref_pair(1, 2)); // OK
}

现场示例

原因是make_pair(2, 1)返回 apair<int, int>minmax(1, 2)返回 a pair<const int&, const int&>。没有参考混合operator==重载pair

然后解决方法是显式编写std::pair<const int&, const int&>(int, int)或将其包装在自制make_cref_pair函数中。

问题:有没有更简洁的方法来比较minmax返回值和一个pair值?我是否正确处理了我的引用make_cref_pair

4

3 回答 3

12

std::minmaxinitializer_list过载。这将返回一个non-const非引用对:

static_assert(std::minmax({2, 1}) == std::make_pair(1, 2));

不幸的是,这可能性能较差,因为复杂性分别是“恰好一个比较”和“最多(3/2) * t.size()应用相应谓词”。

于 2016-05-20T20:06:46.927 回答
5

您可以做的一件事是利用采用 a并返回 a的std::minmax重载。使用它你可以拥有std::initializer_list<T>std::pair<T,T>

int main()
{
    const int a = 10, b = 20;
    static_assert(std::minmax({2, 1}) == std::make_pair(1, 2));
    static_assert(std::minmax({a, b}) == std::make_pair(a, b));
}

将编译并允许您摆脱make_cref_pair. 它确实调用std::minmax_element了,所以我不确定这是否会降低效率。

于 2016-05-20T20:07:11.190 回答
3

一种选择是将左侧显式转换为std::pair<int,int>

#include <algorithm>
#include <utility>

template <typename T1, typename T2>
constexpr std::pair<T1,T2> myminmax(const T1& t1, const T2& t2)
{
    return std::minmax(t1,t2);
}

int main()
{
    static_assert(myminmax(2, 1) == std::make_pair(1, 2));
}
于 2016-05-20T20:08:07.093 回答