2 Stimmen

Wie ist die Syntax für stl-Iteratoren implementiert?

Ich habe in meiner Freizeit daran gearbeitet, eine Bibliothek zu schreiben, um mich mit C++ und der Singulärwertzerlegung besser vertraut zu machen. Ich habe daran gearbeitet, eine Iterator-Klasse zu schreiben, und ich bin durchaus in der Lage, die Funktionalität zu schreiben, und ich habe bereits für meine eigene MatrixIterator-Klasse. Ich vermute, dass es Namespaces beinhaltet, weil:

vector<int>::iterator

Scheint ein Iterator aus dem Namespace-Vektor zu sein, aber Namespaces sind ein anderes Thema, mit dem ich nicht vertraut bin.

Hauptsächlich frage ich, was würde es beinhalten, um einen Iterator zu implementieren, so dass es in ähnlicher Weise wie die stl Iteratoren referenziert werden könnte. Ich bin mir auch bewusst, dass ich boost.iterators oder etwas ähnliches verwenden könnte, um mir eine Menge Arbeit zu ersparen, aber ich bin mehr daran interessiert, alle Details zu lernen, die in etwas wie dies gehen.

3voto

R Samuel Klatchko Punkte 72641

Nein, das hat nichts mit Namespaces zu tun. Es handelt sich einfach um ein Typedef innerhalb einer Klasse:

template <typename T>
class container
{
public:
    typedef ... iterator;
};

Sobald Sie eine Iterator-Klasse haben, müssen Sie eine Reihe von Operatoren implementieren. Für einen Vorwärts-Iterator wäre das:

operator*();
operator++();
operator==(const TYPE &other);

Wenn Sie einen Iterator haben wollen, der vollständig mit dem Rest der STL zusammenarbeiten kann, müssen Sie noch andere Dinge tun, wie zum Beispiel ihm eine Kategorie geben.

2voto

M. Williams Punkte 4895

Normalerweise ist es eine verschachtelte Klasse innerhalb Ihres Containers oder ein Typedef, auf das über :: .

Es gibt eine riesige Menge an Beispielen von Klassen mit Iteratoren im Internet (ich würde nicht empfehlen, die STL-Implementierung zu untersuchen, da sie schwer zu verstehen ist, wenn man sich zum ersten Mal damit beschäftigt).

Sie können sich die STX Btree Implementierung, um ein gut gestaltetes Iterator-Beispiel zu sehen.

1voto

James Punkte 23616

vector<int> ist eine class nicht ein namespace (wichtige Unterscheidung), die Definition ist in etwa so:

template<typename T>
class vector{
    public:
        typedef some_type iterator;
    ...
};

donde some_type wird höchstwahrscheinlich auch ein friend eines Vektors oder sogar einer Mitgliedsklasse

0voto

Mark Rushakoff Punkte 236626

El :: Operator greift nicht nur auf Namespaces zu, sondern auch auf Typedefs, statische Member, Enums usw. einer Klasse.

#include <iostream>

template <typename T>
class Foo
{
    public:
        static void write(T t)
        {
            std::cout << t << std::endl;
        }

        typedef T thing;
};

int main()
{
    Foo<int>::thing my_thing = 42;
    Foo<int>::write(my_thing);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X