2015-05-21 5 views
6

Um zu veranschaulichen, sagen wir, ich habe einen benutzerdefinierten Container als die Verwendung der STL std::vector intern. Wenn ich def std::vector<char*>::iterator bis my_container::iterator tippe, gibt Dereferenzierung des Iterators eine char* zurück. Mein benutzerdefinierter Container sollte jedoch seine Interna verbergen, was bedeutet, dass eine Dereferenzierung eine char zurückgeben soll.Was ist der beste Ansatz zum Umbrechen eines STL-Containers in einem benutzerdefinierten Iterator?

Wie kann dies erreicht werden?

class my_container { 
public: 

    typedef std::vector<char*> vector; 

private: 

    vector vec_; 

}; 

UPDATE:char* ist ein Beispiel. Es bedeutet keine C-Saite; das Beispiel wäre klarer mit einem int.

Auch würde ich gerne std::forward_iterator_tag und std::iterator als dies scheint ein Standard/aktuelle Ansatz.

+0

Möglicherweise müssen Sie Ihre eigene Iterator implementieren, eine, die iteriert auf zwei Ebenen ('char *' der aktuellen Iterator und 'char' für Ihren Dereferenzierungsoperator). –

+0

Woher kommt 'char', wollen Sie über jede Teilkette innerhalb des Vektors iterieren oder zweimal deneferenzieren? – Barry

Antwort

5

Wenn Sie einen eigenen Iterator haben wollen, fangen Sie einfach an, ihn als verschachtelte Klasse zu schreiben. Es müssen eine std::vector<char*>::iterator wickeln, die üblichen Operationen abfangen (z ++, *, --), so etwas wie:

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

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

Wenn Sie es versuchen und stecken bleiben, posten Sie Ihre Versuch, und wir werden Ihnen weiterhelfen.

4

Die beste weg? Puh !, schwierige Frage.

ein Weg ist, die sehr nützlichen Rahmen zu verwenden, die genau zu diesem Zweck von den netten Leuten bei boost.org erstellt wurde:

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

+0

Yup, diese Bibliothek trifft die Stelle. –

1

Verwendung boost::indirect_iterator.

EDIT: (Ungeprüfte)

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

können Sie Ihre Antwort verbessern und erklären, wie sie auf die Frage antwortet – mpromonet

Verwandte Themen