2011-10-13 14 views
15

¿Cómo obtengo un const_iterator de un iterator en C++? ¿Qué tal un const_iterator de un insert_iterator? El iterator resultante debe apuntar en el mismo lugar que el original.C++ iterator to const_iterator

+0

¿La fundición no funciona? – Pubby

+1

@ Pubby8: ¡Ni siquiera necesitas un yeso! –

+0

Huh, debo haber cometido un error. Pensé que recibí un error de compilación cuando traté de convertirlos implícitamente. –

Respuesta

22

Los contenedores están obligados a proporcionar iterator como un tipo convertible en const_iterator, por lo que se puede convertir implícitamente:

Container::iterator it = /* blah */; 
Container::const_iterator cit = it; 

std::insert_iterator s son iteradores de salida. Esto no permite convertirlos a un Container::iterator normal que debe ser un iterador directo.

Otro tipo de inserto de inserción puede permitir tal cosa, pero los obtenidos a partir de las funciones estándar no lo hacen.

Creo que se puede escribir su propia envoltura alrededor std::insert_iterator que expone el miembro protegido iter, sin embargo:

template <typename Container> 
class exposing_insert_iterator : public std::insert_iterator<Container> { 
public: 
    exposing_insert_iterator(std::insert_iterator<Container> it) 
    : std::insert_iterator<Container>(it) {} 
    typename Container::iterator get_iterator() const { 
     return std::insert_iterator<Container>::iter; 
    } 
}; 

// ... 
std::insert_iterator<Container> ins_it; 
exposing_insert_iterator<Container> exp_it = ins_it; 
Container::iterator it = exp_it.get_iterator(); 
4

Puede convertirlos. Ejemplo:

std::vector<int> v; 
std::vector<int>::iterator it = v.begin(); 
std::vector<int>::const_iterator cit = it; 

Pero supongo que esa no es la respuesta que está buscando. Muéstrame el código. :-)

Cuestiones relacionadas