2011-04-30 16 views
5

¿Es posible comparar dos iteradores? Una comparación usando std :: minComparar iteradores, C++

void change (typename TList <Item *>::Type ::iterator it_begin, typename TList <Item*>::Type ::iterator it_end) 
{ 
    .... 
this->items.resize (index); 
    std::sort (it_begin, std::min (it_end, it_begin += index - 1); //Compare two iterators, exception 
.... 
} 

lanza la siguiente excepción:

Assertion failed: Vector iterators incompatible... 

¿Hay alguna otra manera de la comparación?

+0

¿Cuáles son los tipos de 'TList :: Type' y' this-> items'? ¿Los iteradores apuntan a 'this-> items'? –

Respuesta

14

Sí. Pero dudo si puedes hacer eso con std::min.

Puede usar la función std::distance para calcular la distancia entre dos iteradores. Y luego puede usar la distancia para determinar qué iterador es el más pequeño. Una vez que conozca el iterador más pequeño, puede pasarlo a la función std::sort.

Aquí es small illustration how to calculate distance:

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() { 
    std::vector<int> v(100); //vector of size 100 
    std::cout <<(std::distance(v.begin(), v.begin() + 10))<< std::endl; 
    std::cout <<(std::distance(v.begin() +25, v.begin() +10))<< std::endl; 
} 

Salida:

10 
-15 

la esperanza de que le da suficiente idea de cómo proceder para hacer lo que quiere.

+5

"Y luego puede usar la distancia para determinar qué iterador es el más pequeño". Falso. "El comportamiento no está definido si el último no es alcanzable desde el principio (posiblemente repetidamente) incrementando primero". –

+0

Creo que solo querrá hacer esto si los iteradores son de hecho [iteradores de acceso aleatorio] (http://en.cppreference.com/w/cpp/concept/RandomAccessIterator). Dado que son los iteradores que admiten la operación de comparación. – Aleksei

+1

Mooing Duck: antes de C++ 11. Como C++ 11 es Si InputIt es RandomAccessIterator, el comportamiento no está definido si el último no es alcanzable desde el primero y el primero no es accesible desde el último. – xofon

2

Después de llamar al resize, todos sus iteradores existentes no son válidos.

Además, esa línea invoca un comportamiento indefinido, ya que ambos están cambiando it_begin y leyendo de él, en un orden indeterminado.

1

En el libro C++ Primer 5th Ed. en la p.111 sección 3.4.2 Iterator Arithmetic dice,

podemos usar == y! = para comparar con iteradores válidos en cualquiera de los contenedores de la biblioteca.

La sección también nos dice que los iteradores para soporte de serie y el vector de operadores relacionales (también conocido como iterador aritmética) que incluyen>,> =, <, < =.