Auf dieser Seite

QContiguousCache Class

template <typename T> class QContiguousCache

Die Klasse `QContiguousCache` ist eine Template-Klasse, die einen zusammenhängenden Cache bereitstellt. Mehr...

Header: #include <QContiguousCache>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Hinweis: Alle Funktionen dieser Klasse sind reentrant.

Öffentliche Funktionen

QContiguousCache(qsizetype capacity = 0)
QContiguousCache(const QContiguousCache<T> &other)
~QContiguousCache()
void append(const T &value)
bool areIndexesValid() const
const T &at(qsizetype i) const
qsizetype available() const
qsizetype capacity() const
void clear()
bool containsIndex(qsizetype i) const
qsizetype count() const
T &first()
const T &first() const
qsizetype firstIndex() const
void insert(qsizetype i, const T &value)
bool isEmpty() const
bool isFull() const
T &last()
const T &last() const
qsizetype lastIndex() const
void normalizeIndexes()
void prepend(const T &value)
void removeFirst()
void removeLast()
void setCapacity(qsizetype size)
qsizetype size() const
void swap(QContiguousCache<T> &other)
T takeFirst()
T takeLast()
bool operator!=(const QContiguousCache<T> &other) const
QContiguousCache<T> &operator=(QContiguousCache<T> &&other)
QContiguousCache<T> &operator=(const QContiguousCache<T> &other)
bool operator==(const QContiguousCache<T> &other) const
T &operator[](qsizetype i)
const T &operator[](qsizetype i) const

Ausführliche Beschreibung

Die Klasse „QContiguousCache“ bietet eine effiziente Möglichkeit, Elemente vom Typ „ T “ für die Anzeige in einer Benutzeroberflächenansicht zwischenzuspeichern. Im Gegensatz zu „ QCache “ gilt hier die Einschränkung, dass die Elemente im Cache zusammenhängend sein müssen. Dies hat den Vorteil, dass es der Art und Weise entspricht, wie Benutzeroberflächenansichten Daten am häufigsten anfordern, nämlich als eine Reihe von Zeilen, die um die aktuelle Scrollposition herum angeordnet sind. Durch diese Einschränkung benötigt der Cache weniger Speicher und Prozessorzyklen als „ QCache “.

QContiguousCache arbeitet mit einer festen Kapazität, die mit ` setCapacity()` festgelegt oder als Parameter an den Konstruktor übergeben wird. Diese Kapazität ist die Obergrenze für den Speicherverbrauch durch den Cache selbst, ohne den von den Elementen selbst zugewiesenen Speicher. Beachten Sie, dass ein Cache mit einer Kapazität von Null (Standardeinstellung) bedeutet, dass keine Elemente gespeichert werden: Die Operationen ` insert()`, ` append()` und ` prepend()` sind in diesem Fall praktisch wirkungslos. Daher ist es wichtig, die Kapazität auf einen angemessenen Wert festzulegen, bevor Elemente zum Cache hinzugefügt werden.

Die einfachste Art, einen zusammenhängenden Cache zu nutzen, ist die Verwendung von ` append()` und ` prepend()`.

MyRecord record(int row)
{
    Q_ASSERT(row >= 0 && row < cache.count());

    while (row > cache.lastIndex())
        cache.append(slowFetchRecord(cache.lastIndex()+1));
    while (row < cache.firstIndex())
        cache.prepend(slowFetchRecord(cache.firstIndex()-1));

    return cache.at(row);
}

Ist der Cache voll, wird der Eintrag am gegenüberliegenden Ende des Caches – also dort, wo der neue Eintrag angehängt oder vorangestellt wird – entfernt.

Diese Vorgehensweise lässt sich weiter optimieren, indem die Funktion ` insert()` verwendet wird, wenn die angeforderte Zeile weit von den aktuell im Cache befindlichen Elementen entfernt ist. Befindet sich zwischen der Einfügeposition des neuen Elements und den aktuell zwischengespeicherten Elementen eine Lücke, werden zunächst die vorhandenen zwischengespeicherten Elemente entfernt, um die zusammenhängende Struktur des Caches zu erhalten. Daher ist bei der Verwendung von ` insert()` Vorsicht geboten, um ein ungewolltes Leeren des Caches zu vermeiden.

Der gültige Indexbereich für die Klasse `QContiguousCache` reicht von 0 bis `INT_MAX`. Der Aufruf von ` prepend()` so, dass der erste Index kleiner als 0 wird, oder von ` append()` so, dass der letzte Index größer als `INT_MAX` wird, kann dazu führen, dass die Indizes des Caches ungültig werden. Sind die Cache-Indizes ungültig, ist es wichtig, vor dem Aufruf von „ containsIndex()“, „ firstIndex()“, „ lastIndex()“, „ at()“ oder „ operator[]()“ zunächst „ normalizeIndexes()“ aufzurufen. Der Aufruf dieser Funktionen bei ungültigen Cache-Indizes führt zu undefiniertem Verhalten. Die Indizes können mit „ areIndexesValid()“ überprüft werden.

In den meisten Fällen liegen die Indizes im Bereich von 0 bis INT_MAX, sodass die Verwendung von ` normalizeIndexes()` nicht erforderlich ist.

Siehe das Beispiel „Contiguous Cache “.

Dokumentation zu den Member-Funktionen

[explicit] QContiguousCache::QContiguousCache(qsizetype capacity = 0)

Erstellt einen Cache mit dem angegebenen „ capacity “.

Siehe auch ` setCapacity()`.

QContiguousCache::QContiguousCache(const QContiguousCache<T> &other)

Erstellt eine Kopie von ` other`.

Dieser Vorgang dauert eine konstante Zeit, da `QContiguousCache` implizit gemeinsam genutzt wird. Dadurch ist die Rückgabe eines `QContiguousCache` aus einer Funktion sehr schnell. Wird eine gemeinsam genutzte Instanz geändert, wird sie kopiert (Copy-on-Write), was lineare Zeit in Anspruch nimmt.

Siehe auch ` operator=()`.

QContiguousCache::~QContiguousCache()

Löscht den Cache.

void QContiguousCache::append(const T &value)

Fügt „ value “ am Ende des Caches ein. Ist der Cache bereits voll, wird der Eintrag am Anfang des Caches entfernt.

Siehe auch prepend(), insert() und isFull().

bool QContiguousCache::areIndexesValid() const

Gibt zurück, ob die Indizes für die im Cache gespeicherten Elemente gültig sind. Indizes können ungültig werden, wenn Elemente hinter der Indexposition INT_MAX angehängt oder vor der Indexposition 0 vorangestellt werden. Dies ist nur bei einer sehr langlebigen Nutzung des zusammenhängenden Caches im Stil eines Ringpuffers zu erwarten. Indizes können durch den Aufruf von ` normalizeIndexes()` wieder gültig gemacht werden.

Siehe auch ` normalizeIndexes()`, ` append()` und ` prepend()`.

const T &QContiguousCache::at(qsizetype i) const

Gibt das Element an der Indexposition „ i “ im Cache zurück. „ i “ muss eine gültige Indexposition im Cache sein (d. h., firstIndex() <= i <= lastIndex()).

Die Indizes im Cache beziehen sich auf die Anzahl der Positionen, um die das Element vom ersten in den Cache eingefügten Element entfernt ist. Das heißt, ein Cache mit einer Kapazität von 100, dem 150 Elemente hinzugefügt wurden, hat einen gültigen Indexbereich von 50 bis 149. Dies ermöglicht das Einfügen und Abrufen von Elementen in den Cache auf der Grundlage einer theoretisch unendlichen Liste

Siehe auch firstIndex(), lastIndex(), insert() und operator[]().

qsizetype QContiguousCache::available() const

Gibt die Anzahl der Elemente zurück, die dem Cache hinzugefügt werden können, bevor dieser voll ist.

Siehe auch size(), capacity() und isFull().

qsizetype QContiguousCache::capacity() const

Gibt die Anzahl der Elemente zurück, die der Cache speichern kann, bevor er voll ist. Wenn ein Cache eine Anzahl von Elementen enthält, die seiner Kapazität entspricht, führt das Hinzufügen neuer Elemente dazu, dass die Elemente, die am weitesten vom hinzugefügten Element entfernt sind, entfernt werden.

Siehe auch setCapacity() und size().

void QContiguousCache::clear()

Entfernt alle Elemente aus dem Cache. Die Kapazität bleibt unverändert.

bool QContiguousCache::containsIndex(qsizetype i) const

Gibt „ true “ zurück, wenn der Indexbereich des Caches den angegebenen Index „ i “ enthält.

Siehe auch firstIndex() und lastIndex().

qsizetype QContiguousCache::count() const

Entspricht ` size()`.

T &QContiguousCache::first()

Gibt eine Referenz auf das erste Element im Cache zurück. Diese Funktion setzt voraus, dass der Cache nicht leer ist.

Siehe auch last() und isEmpty().

const T &QContiguousCache::first() const

Dies ist eine überladene Funktion.

qsizetype QContiguousCache::firstIndex() const

Gibt den ersten gültigen Index im Cache zurück. Der Index ist ungültig, wenn der Cache leer ist.

Siehe auch capacity(), size() und lastIndex().

void QContiguousCache::insert(qsizetype i, const T &value)

Fügt den Wert „ value “ an der Indexposition „ i “ ein. Enthält der Cache bereits einen Eintrag unter „ i “, wird dieser Wert überschrieben. Liegt „ i “ entweder um eins über „ lastIndex “ () oder um eins unter „ firstIndex “ (), entspricht dies einem „ append “ () oder einem „ prepend “ ().

Wenn der angegebene Index i weder innerhalb des aktuellen Bereichs des Caches liegt noch an die Grenzen des Indexbereichs des Caches angrenzt, wird der Cache vor dem Einfügen des Elements zunächst geleert. Zu diesem Zeitpunkt hat der Cache eine Größe von 1. Es lohnt sich, Elemente in einer Reihenfolge einzufügen, die angrenzend an den aktuellen Indexbereich des Caches beginnt.

Der Bereich gültiger Indizes für die Klasse „ QContiguousCache “ reicht von 0 bis INT_MAX. Das Einfügen außerhalb dieses Bereichs führt zu undefiniertem Verhalten.

Siehe auch prepend(), append(), isFull(), firstIndex() und lastIndex().

bool QContiguousCache::isEmpty() const

Gibt „ true “ zurück, wenn keine Elemente im Cache gespeichert sind.

Siehe auch „ size()“ und „ capacity()“.

bool QContiguousCache::isFull() const

Gibt „ true “ zurück, wenn die Anzahl der im Cache gespeicherten Elemente der Kapazität des Caches entspricht.

Siehe auch „ size()“ und „ capacity()“.

T &QContiguousCache::last()

Gibt eine Referenz auf das letzte Element im Cache zurück. Diese Funktion setzt voraus, dass der Cache nicht leer ist.

Siehe auch first() und isEmpty().

const T &QContiguousCache::last() const

Dies ist eine überladene Funktion.

qsizetype QContiguousCache::lastIndex() const

Gibt den letzten gültigen Index im Cache zurück. Der Index ist ungültig, wenn der Cache leer ist.

Siehe auch capacity(), size() und firstIndex().

void QContiguousCache::normalizeIndexes()

Verschiebt den ersten und den letzten Index des Caches so, dass sie auf gültige Indizes verweisen. Die Funktion verändert weder den Inhalt des Caches noch die Reihenfolge der Elemente innerhalb des Caches.

Sie wird bereitgestellt, damit Indexüberläufe korrigiert werden können, wenn der Cache als Ringpuffer verwendet wird.

QContiguousCache<int> cache(10);
cache.insert(INT_MAX, 1); // cache contains one value and has valid indexes, INT_MAX to INT_MAX
cache.append(2); // cache contains two values but does not have valid indexes.
cache.normalizeIndexes(); // cache has two values, 1 and 2.  New first index will be in the range of 0 to capacity().

Siehe auch areIndexesValid(), append() und prepend().

void QContiguousCache::prepend(const T &value)

Fügt „ value “ am Anfang des Caches ein. Ist der Cache bereits voll, wird das Element am Ende des Caches entfernt.

Siehe auch append(), insert() und isFull().

void QContiguousCache::removeFirst()

Entfernt das erste Element aus dem Cache. Diese Funktion setzt voraus, dass der Cache nicht leer ist.

Siehe auch ` removeLast()`.

void QContiguousCache::removeLast()

Entfernt den letzten Eintrag aus dem Cache. Diese Funktion setzt voraus, dass der Cache nicht leer ist.

Siehe auch ` removeFirst()`.

void QContiguousCache::setCapacity(qsizetype size)

Stellt die Kapazität des Caches auf den angegebenen Wert „ size “ ein. Ein Cache kann eine Anzahl von Elementen aufnehmen, die seiner Kapazität entspricht. Beim Einfügen, Anhängen oder Voranstellen von Elementen in den Cache wird – sofern der Cache bereits voll ist – das Element entfernt, das am weitesten vom hinzugefügten Element entfernt ist.

Ist der angegebene Wert ` size ` kleiner als die aktuelle Anzahl der Elemente im Cache, bleiben nur die letzten ` size ` Elemente im Cache erhalten.

Siehe auch „ capacity()“ und „ isFull()“.

qsizetype QContiguousCache::size() const

Gibt die Anzahl der im Cache enthaltenen Elemente zurück.

Siehe auch ` capacity()`.

[noexcept] void QContiguousCache::swap(QContiguousCache<T> &other)

Tauscht diesen Cache gegen other aus. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.

T QContiguousCache::takeFirst()

Entfernt das erste Element aus dem Cache und gibt es zurück. Diese Funktion setzt voraus, dass der Cache nicht leer ist.

Wenn Sie den Rückgabewert nicht verwenden, ist ` removeFirst()` effizienter.

Siehe auch ` takeLast()` und ` removeFirst()`.

T QContiguousCache::takeLast()

Entfernt das letzte Element aus dem Cache und gibt es zurück. Diese Funktion setzt voraus, dass der Cache nicht leer ist.

Wenn Sie den Rückgabewert nicht verwenden, ist ` removeLast()` effizienter.

Siehe auch ` takeFirst()` und ` removeLast()`.

bool QContiguousCache::operator!=(const QContiguousCache<T> &other) const

Gibt „ true “ zurück, wenn „ other “ nicht mit diesem Cache übereinstimmt; andernfalls wird „ false “ zurückgegeben.

Zwei Caches gelten als gleich, wenn sie an denselben Indizes dieselben Werte enthalten. Diese Funktion setzt voraus, dass der Werttyp die Schnittstelle ` operator==()` implementiert.

Siehe auch ` operator==()`.

[noexcept] QContiguousCache<T> &QContiguousCache::operator=(QContiguousCache<T> &&other)

Weist „ other “ dieser „ QContiguousCache “-Instanz zu.

QContiguousCache<T> &QContiguousCache::operator=(const QContiguousCache<T> &other)

Weist diesem Cache „ other “ zu und gibt eine Referenz auf diesen Cache zurück.

bool QContiguousCache::operator==(const QContiguousCache<T> &other) const

Gibt „ true “ zurück, wenn „ other “ mit diesem Cache übereinstimmt; andernfalls wird „ false “ zurückgegeben.

Zwei Caches gelten als gleich, wenn sie an denselben Indizes dieselben Werte enthalten. Diese Funktion setzt voraus, dass der Werttyp die Schnittstelle ` operator==()` implementiert.

Siehe auch ` operator!=()`.

T &QContiguousCache::operator[](qsizetype i)

Gibt das Element an der Indexposition i als veränderbare Referenz zurück. Wenn der Cache kein Element an der angegebenen Indexposition i enthält, wird zunächst ein leeres Element an dieser Position eingefügt.

In den meisten Fällen ist es besser, entweder ` at()` oder ` insert()` zu verwenden.

Hinweis: Diese nicht-konstante Überladung des Operators [] erfordert, dass „ QContiguousCache “ eine tiefe Kopie erstellt. Verwenden Sie „ at()“ für den schreibgeschützten Zugriff auf ein nicht-konstantes „ QContiguousCache “.

Siehe auch „ insert()“ und „ at()“.

const T &QContiguousCache::operator[](qsizetype i) const

Genau wie unter (i).

Dies ist eine überladene Funktion.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.