Namespaces
Variants

rango-acceso-aleatorio-con-tamaño

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 


template< class T >
concept /*sized-random-access-range*/ =
    ranges::random_access_range<T> &&
    ranges::sized_range<T>;
(desde C++26)
(solo exposición*)

El concepto de solo exposición sized-random-access-range especifica los requisitos de un tipo range que conoce su tamaño en tiempo constante y permite acceso aleatorio a sus elementos.

Notas

sized-random-access-range es utilizado por los algoritmos de rangos paralelos para rechazar argumentos de rango no acotados. Las razones para esto son:

  • Para una implementación paralela eficiente, es necesario conocer los límites del espacio de iteración. De lo contrario, es difícil aplicar la estrategia de "divide y vencerás" para crear trabajo para múltiples hilos de ejecución.
  • Si bien los algoritmos de rango en serie permiten pasar un rango "infinito" como std::ranges::views::iota(0), esto puede resultar en un bucle infinito. Es difícil imaginar la utilidad de esto en el caso de ejecución paralela. Exigir que las secuencias de datos estén acotadas potencialmente evita errores en tiempo de ejecución.
  • El uso de rangos de salida explícitamente acotados sigue las prácticas establecidas de codificación segura, que recomiendan o incluso exigen especificar siempre el tamaño de la salida para evitar modificaciones de datos fuera del rango.
  • Si varios rangos o secuencias de entrada están acotados, un algoritmo normalmente debería detenerse tan pronto como se alcance el final del más corto. Ya existen precedentes en el estándar de que un algoritmo tome dos secuencias con tamaños de entrada potencialmente diferentes y elija el tamaño más pequeño como el número de iteraciones que va a realizar, como std::ranges::transform y std::ranges::mismatch.
  • Como las secuencias de datos de salida están acotadas, ya no se supone que tengan suficiente espacio para toda la entrada. Por lo tanto, existe la posibilidad de que algunos elementos de las secuencias de entrada no sean procesados por un algoritmo, y tiene sentido que este devuelva iteradores a las posiciones en estas secuencias donde se detuvo el procesamiento.