Espacios de nombres
Variantes
Acciones

std::distance

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos de algoritmos y servicios
Conceptos invocables indirectos
Requerimientos comunes de algoritmos
Servicios
Adaptadores de iteradores
Iteradores de flujos
Puntos de personalización de iteradores
Operaciones de iteradores
distance
(C++11)
(C++11)
Acceso a rangos
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
Definido en el archivo de encabezado <iterator>
template<class InputIt >

typenamestd::iterator_traits<InputIt>::difference_type

    distance( InputIt first, InputIt last );
(constexpr desde C++17)

Devuelve el número de saltos desde first hasta last.

Si InputIt no es RandomAccessIterator, el comportamiento no está definido si last no es alcanzable desde first.

Si InputIt es RandomAccessIterator, el comportamiento no está definido si first y last no son alcanzables uno del otro.

Contenido

[editar]Parámetros

first - Iterador que apunta al primer elemento.
last - Iterador que apunta al final del rango.
Requisitos de tipo
-
InputIt debe satisfacer los requisitos de InputIterator. La operación es más eficiente si InputIt cumple además los requisitos de RandomAccessIterator.

[editar]Valor de retorno

El número de incrementos necesarios para ir de first a last.

El valor puede ser negativo si se utilizan iteradores de acceso aleatorio y first se puede alcanzar desde last.

(desde C++11)

[editar]Complejidad

Lineal.

Sin embargo, si InputIt cumple además los requisitos de RandomAccessIterator, la complejidad es constante.

[editar]Posible implementación

Véanse también las implementaciones en libstdc++ y libc++.

Implementación en C++98 implementation vía despacho con etiquetas, con constexpr elminado
namespace detail {template<class It>constexpr// requerido desde C++17typenamestd::iterator_traits<It>::difference_type do_distance(It first, It last, std::input_iterator_tag){typenamestd::iterator_traits<It>::difference_type result =0;while(first != last){++first;++result;}return result;}   template<class It>constexpr// requerido desde C++17typenamestd::iterator_traits<It>::difference_type do_distance(It first, It last, std::random_access_iterator_tag){return last - first;}}// namespace detail   template<class It>constexpr// desde C++17typenamestd::iterator_traits<It>::difference_type distance(It first, It last){return detail::do_distance(first, last, typenamestd::iterator_traits<It>::iterator_category());}
Implementación en C++17 vía ifconstexpr
template<class It>constexprtypenamestd::iterator_traits<It>::difference_type distance(It first, It last){using category =typenamestd::iterator_traits<It>::iterator_category; static_assert(std::is_base_of_v<std::input_iterator_tag, category>);   ifconstexpr(std::is_base_of_v<std::random_access_iterator_tag, category>)return last - first;else{typenamestd::iterator_traits<It>::difference_type result =0;while(first != last){++first;++result;}return result;}}

[editar]Ejemplo

#include <iostream>#include <iterator>#include <vector>   int main(){std::vector<int> v{3, 1, 4};std::cout<<"distance(first, last) = "<< std::distance(v.begin(), v.end())<<'\n'<<"distance(last, first) = "<< std::distance(v.end(), v.begin())<<'\n';// el comportamiento no está definido (hasta LWG940)   staticconstexprauto il ={3, 1, 4};// Desde C++17 `distance` puede usarse en un contexto constexpr. static_assert(std::distance(il.begin(), il.end())==3); static_assert(std::distance(il.end(), il.begin())==-3);}

Salida:

distance(first, last) = 3 distance(last, first) = -3

[editar]Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 940 C++98 La redacción no era clara para el caso en el que first se puede alcanzar desde last. Se aclaró.

[editar]Véase también

Avanza un iterador en una distancia determinada.
(función)[editar]
Devuelve el número de elementos que cumplan con un criterio específico.
(plantilla de función)[editar]
Devuelve la distancia entre un iterador y un centinela, o entre el principio y el fin de un rango.
(niebloid)[editar]
close