将std :: minmax与一对进行比较

Tem*_*Rex 11 c++ algorithm minmax c++14

标准算法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
}
Run Code Online (Sandbox Code Playgroud)

实例

原因是make_pair(2, 1)返回a pair<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

use*_*820 12

std::minmax有一个initializer_list超载.这将返回一个non-const非引用对:

static_assert(std::minmax({2, 1}) == std::make_pair(1, 2));
Run Code Online (Sandbox Code Playgroud)

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

  • @TemplateRex如果你之后尝试访问"first"或"second",那么悬空引用的问题只是一个问题.AFAIK这也是'minmax`的问题.一个看似合理的解决方法是使用`reference_wrapper`. (2认同)

Nat*_*ica 5

你可以做的一件事就是利用std::minmax带有a std::initializer_list<T>并返回a 的重载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));
}
Run Code Online (Sandbox Code Playgroud)

哪个会编译并允许你摆脱make_cref_pair.它确实打电话,std::minmax_element所以我不确定这是否会降低效率.