2015-05-21 10 views
6

Per illustrare, diciamo che ho un contenitore personalizzato rispetto all'uso STL std::vector internamente. Se digitando a my_container::iterator, il dereferenziamento dell'iteratore restituirà un valore char*. Tuttavia, il mio contenitore personalizzato dovrebbe nascondere i suoi interni, nel senso che voglio un dereferenziamento per restituire un char.Qual è l'approccio migliore per il wrapping di un container STL in un iteratore personalizzato?

Come può essere realizzato?

class my_container { 
public: 

    typedef std::vector<char*> vector; 

private: 

    vector vec_; 

}; 

UPDATE:char* è un esempio. Non significa una stringa C; l'esempio sarebbe più chiaro con uno int.

Inoltre, vorrei utilizzare std::forward_iterator_tag e std::iterator in quanto sembra un approccio più standard/corrente.

+0

Potrebbe essere necessario implementare il proprio iteratore, quella che scorre su due livelli ('char *' del iteratore reale, e 'char' per il proprio operatore dereference). –

+0

Da dove proviene 'char', intendi iterare su ciascuna sottostringa all'interno del vettore o semplicemente dereferenziare due volte? – Barry

risposta

5

Se si desidera il proprio iteratore, è sufficiente iniziare a scriverlo come classe nidificata. Essa dovrà avvolgere un std::vector<char*>::iterator, intercettando le normali operazioni (ad esempio ++, *, --), qualcosa come:

class iterator 
{ 
    public: 
    iterator& operator++() { ++i_; return *this; } 
    char& operator*() { return **i_; } 
    ...etc... 

    private: 
    std::vector<char*>::iterator i_; 
}; 

Se lo provate e rimani bloccato, pubblicare il tuo tentativo e ti aiuteremo ulteriormente.

4

Il migliore modo? phew !, domanda difficile.

un modo è quello di utilizzare il quadro molto utile che è stato creato proprio per questo scopo dai simpatici ragazzi a boost.org:

http://www.boost.org/doc/libs/1_58_0/libs/iterator/doc/

+0

Sì, questa libreria va a fuoco. –

1

Usa boost::indirect_iterator.

EDIT: (testato)

struct S 
{ 
    using iterator = 
     boost::indirect_iterator<std::vector<char*>::iterator>; 
    using const_iterator = 
     boost::indirect_iterator<std::vector<char*>::const_iterator>; 

    iterator begin() { return iterator(vec_.begin()); } 
    iterator end() { return iterator(vec_.begin()); } 
    const_iterator begin() const { return const_iterator(vec_.begin()); } 
    const_iterator end() const { return const_iterator(vec_.begin()); } 
private: 
    std::vector<char*> vec_; 
}; 
+1

potresti migliorare la tua risposta spiegando come risponde alla domanda – mpromonet

Problemi correlati