QContiguousCache Class

template <typename T> class QContiguousCache

Die Klasse QContiguousCache ist eine Vorlagenklasse, die einen zusammenhängenden Cache bereitstellt. Mehr...

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

Hinweis: Alle Funktionen in 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

Detaillierte Beschreibung

Die Klasse QContiguousCache bietet eine effiziente Möglichkeit, Elemente für die Anzeige in einer Benutzeroberflächenansicht zwischenzuspeichern. Im Gegensatz zu QCache fügt sie die Einschränkung hinzu, dass Elemente innerhalb des Caches zusammenhängend sein müssen. Dies hat den Vorteil, dass es der Art und Weise entspricht, wie Benutzeroberflächenansichten üblicherweise Daten anfordern, nämlich als eine Reihe von Zeilen, die um die aktuelle Bildlaufposition herum angeordnet sind. Diese Einschränkung ermöglicht es dem Cache, weniger Speicher und Prozessorzyklen zu verbrauchen 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 die Speichernutzung durch den Cache selbst, ohne den von den Elementen selbst zugewiesenen Speicher. Beachten Sie, dass ein Cache mit einer Kapazität von Null (der Standardwert) bedeutet, dass keine Elemente gespeichert werden: Die Operationen insert(), append() und prepend() sind dann praktisch No-ops. Daher ist es wichtig, die Kapazität auf einen vernünftigen Wert zu setzen, bevor Sie dem Cache Elemente hinzufügen.

Die einfachste Art, einen zusammenhängenden Cache zu verwenden, ist die Verwendung der Operationen append() und prepend().

MyRecord record(int row) const
{
    Q_ASSERT(row >= 0 && row < 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);
}

Wenn der Cache voll ist, wird das Element am anderen Ende des Caches, an das das neue Element angehängt oder vorangestellt wird, entfernt.

Diese Verwendung kann weiter optimiert werden, indem die Funktion insert() verwendet wird, wenn die angeforderte Zeile weit von den aktuell zwischengespeicherten Elementen entfernt ist. Wenn eine Lücke zwischen dem neuen Element und den aktuell zwischengespeicherten Elementen besteht, werden die vorhandenen zwischengespeicherten Elemente zuerst entfernt, um den zusammenhängenden Charakter des Cache zu erhalten. Daher ist bei der Verwendung von insert() Vorsicht geboten, um ein unerwünschtes Löschen des Caches zu vermeiden.

Der Bereich der gültigen Indizes für die Klasse QContiguousCache reicht von 0 bis INT_MAX. Der Aufruf von prepend() in der Weise, dass der erste Index kleiner als 0 wird, oder append() in der Weise, dass der letzte Index größer als INT_MAX wird, kann dazu führen, dass die Indizes des Caches ungültig werden. Wenn die Cache-Indizes ungültig sind, ist es wichtig, normalizeIndexes() aufzurufen, bevor eine der Funktionen containsIndex(), firstIndex(), lastIndex(), at() oder operator[]() aufgerufen wird. Der Aufruf dieser Funktionen, wenn der Cache ungültige Indizes hat, führt zu einem undefinierten Verhalten. Die Indizes können mit der Funktion areIndexesValid() überprüft werden.

In den meisten Fällen werden die Indizes nicht größer als 0 bis INT_MAX sein, so dass normalizeIndexes() nicht verwendet werden muss.

Siehe das Beispiel für den zusammenhängenden Cache.

Dokumentation der Mitgliedsfunktionen

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

Konstruiert einen Cache mit dem angegebenen capacity.

Siehe auch setCapacity().

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

Konstruiert eine Kopie von other.

Dieser Vorgang benötigt konstante Zeit, da QContiguousCache implizit gemeinsam genutzt wird. Dies macht die Rückgabe eines QContiguousCache aus einer Funktion sehr schnell. Wenn eine gemeinsam genutzte Instanz geändert wird, wird sie kopiert (copy-on-write), was lineare Zeit benötigt.

Siehe auch operator=().

QContiguousCache::~QContiguousCache()

Zerstört den Cache.

void QContiguousCache::append(const T &value)

Fügt value an das Ende des Caches ein. Wenn der Cache bereits voll ist, wird das Element am Anfang des Caches entfernt.

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

bool QContiguousCache::areIndexesValid() const

Gibt zurück, ob die Indizes für im Cache gespeicherte Elemente gültig sind. Indizes können ungültig werden, wenn Elemente nach der Indexposition INT_MAX angehängt oder vor der Indexposition 0 vorangestellt werden. Dies ist nur bei der Verwendung des zusammenhängenden Cache im Stil eines sehr langlebigen Zirkularpuffers 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, 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 er voll wird.

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 am weitesten vom hinzugefügten Element entfernten Elemente 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

Dasselbe wie size().

T &QContiguousCache::first()

Gibt einen Verweis auf das erste Element im Cache zurück. Diese Funktion geht davon aus, 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. Wenn der Cache bereits ein Element an i enthält, wird dieser Wert ersetzt. Wenn i entweder um eins mehr als lastIndex() oder um eins weniger als firstIndex() ist, entspricht dies einem append() oder einem prepend().

Liegt der angegebene Index i weder im aktuellen Bereich des Cache noch in der Nähe der Grenzen des Indexbereichs des Cache, wird der Cache zunächst geleert, bevor das Element eingefügt wird. Zu diesem Zeitpunkt hat der Cache eine Größe von 1. Es lohnt sich, sich die Mühe zu machen, Elemente in einer Reihenfolge einzufügen, die in der Nähe des aktuellen Indexbereichs für den Cache beginnt.

Der Bereich der gültigen 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 gleich der Kapazität des Cache ist.

Siehe auch size() und capacity().

T &QContiguousCache::last()

Gibt einen Verweis auf das letzte Element im Cache zurück. Diese Funktion geht davon aus, 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 Index und den letzten Index des Caches so, dass sie auf gültige Indizes zeigen. Die Funktion ändert weder den Inhalt des Cache noch die Reihenfolge der Elemente innerhalb des Cache.

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 an den Anfang des Caches ein. Wenn der Cache bereits voll ist, 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 geht davon aus, dass der Cache nicht leer ist.

Siehe auch removeLast().

void QContiguousCache::removeLast()

Entfernt das letzte Element aus dem Cache. Diese Funktion geht davon aus, dass der Cache nicht leer ist.

Siehe auch removeFirst().

void QContiguousCache::setCapacity(qsizetype size)

Setzt die Kapazität des Caches auf den angegebenen Wert size. Ein Cache kann so viele Elemente aufnehmen, wie seine Kapazität beträgt. Beim Einfügen, Anhängen oder Voranstellen von Elementen in den Cache wird das am weitesten vom hinzugefügten Element entfernte Element entfernt, wenn der Cache bereits voll ist.

Wenn die angegebene size kleiner ist als die aktuelle Anzahl der Elemente im Cache, verbleiben nur die letzten size Elemente im Cache.

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 mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.

T QContiguousCache::takeFirst()

Entfernt das erste Element aus dem Cache und gibt es zurück. Diese Funktion geht davon aus, 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 geht davon aus, 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 gleich diesem Cache ist; andernfalls wird false zurückgegeben.

Zwei Caches gelten als gleich, wenn sie die gleichen Werte an den gleichen Indizes enthalten. Diese Funktion benötigt den Wertetyp, um die operator==() zu implementieren.

Siehe auch operator==().

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

Verschieben - weist other dieser QContiguousCache Instanz zu.

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

Weist other diesem Cache zu und gibt einen Verweis auf diesen Cache zurück.

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

Gibt true zurück, wenn other gleich diesem Cache ist; andernfalls wird false zurückgegeben.

Zwei Caches werden als gleich angesehen, wenn sie die gleichen Werte an den gleichen Indizes enthalten. Diese Funktion benötigt den Wertetyp, um die operator==() zu implementieren.

Siehe auch operator!=().

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

Gibt das Element an der Indexposition i als ä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 von operator[] erfordert QContiguousCache, um eine tiefe Kopie zu erstellen. Verwenden Sie at() für den Nur-Lese-Zugriff auf eine nicht-konstante QContiguousCache.

Siehe auch insert() und at().

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

Dies ist eine überladene Funktion.

Dasselbe wie at(i).

© 2025 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.