Namensräume
Varianten
Aktionen

std::contiguous_iterator

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
contiguous_iterator
(C++20)


Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Definiert in Header <iterator>
template< class I >

    concept contiguous_iterator =
        std::random_access_iterator<I> &&
        std::derived_from</*ITER_CONCEPT*/<I>, std::contiguous_iterator_tag> &&
        std::is_lvalue_reference_v<std::iter_reference_t<I>> &&
        std::same_as<std::iter_value_t<I>,
                     std::remove_cvref_t<std::iter_reference_t<I>>> &&
        requires(const I& i) {
            { std::to_address(i) } ->
              std::same_as<std::add_pointer_t<std::iter_reference_t<I>>>;

        };
(seit C++20)

Das Konzept contiguous_iterator verfeinert random_access_iterator, indem es garantiert, dass die bezeichneten Elemente zusammenhängend im Speicher gespeichert sind.

Inhalt

[bearbeiten] Bestimmung des Iterator-Konzepts

Die Definition dieses Konzepts wird über ein expositions-only-Alias-Template /*ITER_CONCEPT*/ spezifiziert.

Um /*ITER_CONCEPT*/<I> zu bestimmen, bezeichne ITER_TRAITS<I> I, wenn die Spezialisierung std::iterator_traits<I> aus der Primärvorlage generiert wird, andernfalls std::iterator_traits<I>.

  • Wenn ITER_TRAITS<I>::iterator_concept gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/<I> diesen Typ.
  • Andernfalls, wenn ITER_TRAITS<I>::iterator_category gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/<I> diesen Typ.
  • Andernfalls, wenn std::iterator_traits<I> aus der primären Vorlage generiert wird, bezeichnet /*ITER_CONCEPT*/<I> std::random_access_iterator_tag.
  • Andernfalls bezeichnet /*ITER_CONCEPT*/<I> keinen Typ und führt zu einem Substitutionsfehler.

[bearbeiten] Semantische Anforderungen

Seien a und b dereferenzierbare Iteratoren und c ein nicht dereferenzierbarer Iterator vom Typ I, so dass b von a erreichbar ist und c von b erreichbar ist. Der Typ I modelliert contiguous_iterator nur, wenn alle von ihm subsumierten Konzepte modelliert werden und alle folgenden Bedingungen erfüllt sind.

[bearbeiten] Gleichheitserhaltung

Ausdrücke, die in requires-Ausdrücken der Standardbibliothekskonzepte deklariert sind, müssen gleichheitserhaltend sein (sofern nicht anders angegeben).

[bearbeiten] Implizite Ausdrucksvariationen

Ein requires-Ausdruck, der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvariationen.

[bearbeiten] Anmerkungen

contiguous_iterator wird von jedem Zeigertyp auf einen vollständigen Objekttyp modelliert.

Iterator-Typen in der Standardbibliothek, die die LegacyContiguousIterator-Anforderungen in C++17 erfüllen müssen, müssen in C++20 auch contiguous_iterator modellieren.

[bearbeiten] Defect reports

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3607 C++20 contiguous_iterator könnte benutzerdefinierte
ranges::iter_move und ranges::iter_swap Verhaltensweisen haben
verboten
LWG 4170 C++20 ein Paar wertinitialisierter contiguous_iterators
könnte möglicherweise keinen leeren Bereich darstellen
garantiert

[bearbeiten] Siehe auch

spezifiziert, dass ein bidirectional_iterator ein Zufallszugriff-Iterator ist, der die Vorwärtsbewegung in konstanter Zeit und Indizierung unterstützt
(Konzept) [bearbeiten]