2011-10-13 19 views
15

Jak mogę uzyskać const_iterator z iterator w C++? A co z const_iterator z insert_iterator? Wynikowy kod iterator powinien wskazywać to samo miejsce, co oryginał.iterator C++ do const_iterator

+0

Odlewanie nie działa? – Pubby

+1

@ Pubby8: Nie potrzebujesz nawet obsady! –

+0

Huh, chyba zawiodłem. Myślałem, że mam błąd kompilatora, gdy próbowałem je niejawnie przekonwertować. –

Odpowiedz

22

Kontenery są wymagane do zapewnienia iterator jako typ zamiennego do const_iterator, więc można przekonwertować domyśle:

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

std::insert_iterator s wyprowadzane są iteratory. W ten sposób nie można ich przekonwertować na zwykły numer Container::iterator, który musi być iteratorem do przodu.

Inny rodzaj iteratora wstawki może pozwolić na coś takiego, ale te uzyskane ze standardowych funkcji nie.

Myślę, że można napisać własne otoki wokół std::insert_iterator że odsłania chroniony członek iter, chociaż:

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

Można je konwertować. Przykład:

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

Ale myślę, że nie jest to odpowiedź, której szukasz. Pokaż mi kod. :-)

Powiązane problemy