min_element c++ c++11

c++ - min_element - Sobrecargas de std:: minmax() y std:: tie



min c++ (1)

La función std::minmax introducida en C ++ 11 se supone que devuelve un par de los valores más bajos y más altos respectivamente.

En este ejemplo:

int a = 6, b = 5; auto p = std::minmax(a, b); std::cout << "p.first = " << p.first << std::endl; std::cout << "p.second = " << p.second << std::endl;

Esto funciona como se anuncia y se imprime.

p.first = 5
p.second = 6

Ahora me gustaría modificar efectivamente a y b para forzar a b a ser más bajo que a, como si estuviera ejecutando este código:

if (b > a) std::swap(a, b);

Así que he escrito esto:

int a = 5, b = 6; std::tie(b, a) = std::minmax(a, b); std::cout << "a = " << a << std::endl; std::cout << "b = " << b << std::endl;

Sin embargo, esto imprime:

a = 5
b = 5

Usando la sobrecarga initializer_list en su lugar, como esto:

std::tie(b, a) = std::minmax({a, b});

hace que se imprima el resultado esperado:

a = 6
b = 5

El compilador es GCC 4.7.1 (también probado con GCC 4.8.1 en Linux y Windows con Mingw-w64). He creado un SSCCE en http://ideone.com/fA0qw5 .

¿Por qué la sobrecarga de dos argumentos no hace lo que se supone que debe hacer al usar std::tie ?


El problema es que std::minmax devuelve referencias para la versión de 2 argumentos. De esa manera, tan pronto como se asigna b en el std::tie(b, a) , el cambio se refleja en la parte b del std::pair devuelto, dándole el valor de 5 , que a su vez se asigna a la a en std::tie(b, a) , dando como resultado (5, 5) .