reverse-iterator

___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstnhdr ___ Warum definiert reverse_iterator seine verschachtelten Typen doppelt? ___ tag123languagelawyer ___ Für Fragen zu den Feinheiten formeller oder autoritativer Spezifikationen von Programmiersprachen und Umgebungen. ___ tag123iterator ___ Ein Iterator ist ein objektorientiertes Programmiermuster, das das Durchlaufen einer Sammlung unabhängig von der tatsächlichen Implementierung oder Objektadressen im physischen Speicher ermöglicht. Es ist eines der Verhaltensmuster der Gang of Four. ___ answer29109190 ___

Seit einiger Zeit haben sie sich von der Verwendung von %code% als Basisklasse entfernt und müssen lediglich angeben, dass jeder Iterator die korrekten Typnamen definieren muss.

Wenn sie die Basisklasse im Standard angeben, wird dadurch die Implementierung der Klasse eingeschränkt, obwohl die einzige wirkliche Absicht darin besteht, anzugeben, dass der Iterator einige Namen definieren muss. Insbesondere könnten Sie %code% ermitteln, um festzustellen, ob %code% eine Basisklasse von %code% ist. Nein, es gibt nichts polymorphes, also ist es ziemlich dumm und sinnlos, das zu tun, aber wenn du das tust, sagt der aktuelle Standard, dass es muss true zurückgeben soll.

Es sieht (für mich) so aus, als wäre es mehr oder weniger ein zufälliger Zwischenpunkt im Prozess der (mehr oder weniger zufälligen) Bewegung, der die Verwendung von %code% als Basisklasse erfordert und einfach die Namen dafür angibt muss in %code% definiert sein (und natürlich auch in verschiedenen anderen Iteratoren).

Für diejenigen, die sich interessieren, umfasst die Geschichte davon:

N3931
Ausgabe 2438

Es gibt auch so ähnliche Diskussionspapiere über die Abschaffung von unary_function und binary_function:

N3145
N3198

Diese wurden aus ungefähr den gleichen Gründen wie %code% bereitgestellt (dh, um einige typedefs in einer abgeleiteten Klasse bereitzustellen), so dass die Gründe für ihre Entfernung ziemlich passend sind, %code% als Basisklasse zu verwenden / p>     

___ answer29109348 ___

Dies ist eher eine Vermutung, aber all diese redundanten %code% deklarieren Typen, die innerhalb der Spezifikation des Klassenkörpers von %code% verwendet werden. Zum Beispiel (C ++ 03 IS):

%Vor%

Da %code% eine abhängige Basisklasse ist, wird nicht nach den Namen %code% und %code% gesucht. Wenn %code% diese Namen verwendet, wird die verbleibende Spezifikation vereinfacht:

%Vor%

Andererseits erscheint %code% nicht innerhalb des Klassenkörpers, daher benötigt es kein redundantes %code% .

    
___ tag123iteratortraits ___ hilf uns, dieses Wiki zu bearbeiten ___ tag123reversetiterator ___ Speziell für Iteratoren, die einen Container in umgekehrter Reihenfolge durchlaufen. Ein Iterator ist ein objektorientiertes Programmiermuster, das das Durchlaufen einer Sammlung unabhängig von der tatsächlichen Implementierung oder Objektadressen im physikalischen Speicher ermöglicht. ___ qstntxt ___

Es scheint, dass der Iterator-Adapter %code% die meisten seiner verschachtelten Typen doppelt definiert. Insbesondere erbt es öffentlich von %code% , wodurch %code% , %code% , %code% , %code% und %code% verfügbar gemacht werden. Mit Ausnahme von %code% und %code% werden diese explizit explizit in der Klassendefinition angegeben.

24.5.1.1 Klassenvorlage reverse_iterator [reverse.iterator]

%Vor%

Frage : Warum die repetitive Definition? Ist das nur für die Zwecke der Exposition oder gibt es mehr dazu? Und warum nicht %code% und %code% neu definieren?

    
___
1
Antwort

Warum wird durch das Entfernen des _first_ Elements einer Liste '.rend ()' ungültig?

Getestet unter Mac OS X mit XCode 4.6. Dieser Beispielcode zeigt das Entfernen des letzten Elements von std::list funktioniert wie erwartet: Ein Iterator-Verweis auf list::end() ist immer noch "1 nach dem Ende" und ist immer noch gültig...
07.02.2013, 20:13
2
Antworten

Warum definiert reverse_iterator seine verschachtelten Typen doppelt?

Es scheint, dass der Iterator-Adapter reverse_iterator die meisten seiner verschachtelten Typen doppelt definiert. Insbesondere erbt es öffentlich von std::iterator , wodurch iterator_category , value_type , difference_type , pointer...
17.03.2015, 20:21