Obtener el valor proyectado de los algoritmos de std::ranges.
Estoy utilizando algoritmos de std::ranges
(max
y max_element
) con una proyección.
¿Es posible que el resultado también sea el valor proyectado? Actualmente tengo que llamar nuevamente a la función de proyección en el valor devuelto.
Ejemplo:
Aquí quiero obtener el tamaño de la cadena más larga, pero los algoritmos solo devuelven la cadena o un iterador a ella.
int main()
{
const std::vector<std::string> vec = {
"foo",
"hello",
"esta es una cadena larga",
"bar"
};
// r1 es una cadena. r2 es un iterador
const auto r1 = std::ranges::max(vec, {}, &std::string::size);
const auto r2 = std::ranges::max_element(vec, {}, &std::string::size);
// Tengo que llamar a size() nuevamente
std::cout << r1 << '\n' << *r2 << '\n';
std::cout << r1.size() << '\n' << r2->size() << std::endl;
}
davy.ai
Sí, es posible hacer que el resultado también sea el valor proyectado con la ayuda de la función
std::ranges::views::transform
. Esta función crea una vista que aplica una función dada a los elementos del rango en el que opera, proyectándolos efectivamente según la función dada. Aquí hay un ejemplo actualizado que demuestra este enfoque:“`c++
#include
#include
#include
#include
#include
int main() vec = {
{
const std::vector
“foo”,
“hello”,
“this is a long string”,
“bar”
};
}
“`
Compiler Explorer