Namespaces
Variants

C++ named requirements: LegacyIterator

From cppreference.net
C++ named requirements

Die LegacyIterator -Anforderungen beschreiben Typen, die verwendet werden können, um Elemente eines Containers zu identifizieren und zu durchlaufen.

LegacyIterator ist die grundlegende Anforderungsmenge, die von anderen Iteratortypen verwendet wird: LegacyInputIterator , LegacyOutputIterator , LegacyForwardIterator , LegacyBidirectionalIterator und LegacyRandomAccessIterator . Iteratoren können als Abstraktion von Zeigern betrachtet werden.

Alle Kategorien von Iteratoren fordern nur diejenigen Funktionen, die für eine gegebene Kategorie in konstanter Zeit (amortisiert) realisierbar sind. Daher spezifizieren Anforderungstabellen und Konzeptdefinitionen (since C++20) für die Iteratoren keine Komplexität.

Inhaltsverzeichnis

Anforderungen

Der Typ It erfüllt LegacyIterator wenn

  • Der Typ It erfüllt CopyConstructible , und
  • Der Typ It erfüllt CopyAssignable , und
  • Der Typ It erfüllt Destructible , und
  • Der Typ It erfüllt Swappable , und
  • std:: iterator_traits < It > besitzt die Member-Typdefinitionen: value_type , (bis C++20) difference_type , reference , pointer , und iterator_category , und
  • Gegeben r , ein L-Wert vom Typ It , müssen die folgenden Ausdrücke gültig sein und ihre spezifizierten Effekte haben:
Ausdruck Rückgabetyp Vorbedingung
* r nicht spezifiziert r ist dereferenzierbar
++ r It & r ist inkrementierbar (das Verhalten des Ausdrucks ++ r ist definiert)

Concept

Für die Definition von std::iterator_traits wird das folgende, nur zur Darstellung dienende Concept definiert.

template < class I >

concept __LegacyIterator =
requires ( I i )
{
{ * i } - > __Referenceable ;
{ ++ i } - > std:: same_as < I & > ;
{ * i ++ } - > __Referenceable ;

} && std:: copyable < I > ;

wobei das nur zur Darstellung dienende Concept __Referenceable < T > genau dann erfüllt ist, wenn T & ein gültiger Typ ist (insbesondere darf T nicht void sein).

(seit C++20)

Hinweise

Hinweis zur Terminologie: Die folgende Tabelle zeigt die auf dieser Seite verwendeten Namen und die entsprechenden C++-Standard-Namen (mit gleicher Bedeutung). Das "Legacy"- (und "Cpp17")-Präfix betont die Kompatibilität mit vor-C++20-Standards und wird verwendet, um diese Anforderungen von den neuen Iterator-Konzepten zu unterscheiden, die mit C++20 eingeführt wurden.

cppreference Namen C++ Standard Namen C++20 Iterator-Konzepte
LegacyIterator Cpp17Iterator input_or_output_iterator
LegacyInputIterator Cpp17InputIterator input_iterator
LegacyOutputIterator Cpp17OutputIterator output_iterator
LegacyForwardIterator Cpp17ForwardIterator forward_iterator
LegacyBidirectionalIterator Cpp17BidirectionalIterator bidirectional_iterator
LegacyRandomAccessIterator Cpp17RandomAccessIterator random_access_iterator
LegacyContiguousIterator [1] contiguous_iterator
  1. LegacyContiguousIterator Kategorie wurde erst in C++17 formal spezifiziert, aber die Iteratoren von std::vector , std::basic_string , std::array und std::valarray , sowie Zeiger auf C-Arrays wurden in pre-C++17-Code oft als separate Kategorie behandelt.

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Veröffentlichtes Verhalten Korrigiertes Verhalten
LWG 2437 C++98 * r muss ein reference sein nicht für Output-Iteratoren erforderlich
LWG 3420 C++20 das nur-expositionelle Konzept prüft zuerst copyable copyable wird nur geprüft, wenn der Requires-Ausdruck true ergibt

Siehe auch

spezifiziert, dass Objekte eines Typs inkrementiert und dereferenziert werden können
(Konzept)
Iterator-Bibliothek stellt Definitionen für Iteratoren, Iterator-Traits, Adapter und Hilfsfunktionen bereit