Namespaces
Variants

std::ranges::subrange<I,S,K>:: advance

From cppreference.net
Ranges library
Range adaptors
constexpr subrange & advance ( std:: iter_difference_t < I > n ) ;
(desde C++20)

Incrementa o decrementa begin_ :

Equivalente a: ranges:: advance ( begin_  , n ) ;
if constexpr ( StoreSize  )
size_ + = to-unsigned-like  ( - n ) ;
return * this ;
.
  • De lo contrario, incrementa begin_ por n elementos, o hasta que se alcance end_ .
Equivalente a: auto d = n - ranges:: advance ( begin_  , n, end_  ) ;
if constexpr ( StoreSize  )
size_ - = to-unsigned-like  ( d ) ;
return * this ;
.


Según las precondiciones de ranges::advance , si n < 0 es true y begin_ no puede ser decrementado en - n elementos, el comportamiento es indefinido.

Contenidos

Parámetros

n - número de incrementos máximos del iterador

Valor de retorno

* this

Ejemplo

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <ranges>
void print(auto name, auto const sub)
{
    std::cout << name << ".size() == " << sub.size() << "; { ";
    std::ranges::for_each(sub, [](int x) { std::cout << x << ' '; });
    std::cout << "}\n";
};
int main()
{
    std::array arr{1, 2, 3, 4, 5, 6, 7};
    std::ranges::subrange sub{std::next(arr.begin()), std::prev(arr.end())};
    print("1) sub", sub);
    print("2) sub", sub.advance(3));
    print("3) sub", sub.advance(-2));
}

Salida:

1) sub.size() == 5; { 2 3 4 5 6 }
2) sub.size() == 2; { 5 6 }
3) sub.size() == 4; { 3 4 5 6 }

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 3433 C++20 el comportamiento era indefinido si n < 0 se define correctamente si begin_ puede ser decrementado

Véase también

obtiene una copia del subrange con su iterador avanzado por una distancia dada
(función miembro pública)
obtiene una copia del subrange con su iterador decrementado por una distancia dada
(función miembro pública)
avanza un iterador por una distancia dada
(plantilla de función)
avanza un iterador por una distancia dada o hasta un límite especificado
(objeto función de algoritmo)