QContiguousCache Class

template <typename T> class QContiguousCache

QContiguousCache クラスは、連続キャッシュを提供するテンプレート・クラスです。詳細...

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

注釈このクラスのすべての関数はリエントラントです。

パブリック関数

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

詳細説明

QContiguousCache クラスは、ユーザー・インターフェイス・ビューに表示する項目をキャッシュする効率的な方法を提供します。QCache とは異なり、キャッシュ内の要素が連続しているという制限が追加されます。これは、ユーザー・インターフェイス・ビューが、現在のスクロールされた位置の周りに局所化された行のセットとして、データを要求する最も一般的な方法に一致するという利点があります。この制限により、キャッシュはQCache よりも少ないメモリとプロセッサ・サイクルを消費します。

QContiguousCache は、setCapacity() で設定するか、コンストラクタのパラメータとして渡される固定容量で動作します。この容量は、キャッシュ自体によるメモリ使用量の上限であり、要素自体によって割り当てられるメモリは含まれません。容量がゼロのキャッシュ(デフォルト)は、アイテムが格納されないことを意味します。insert(),append(),prepend() の操作は、事実上ノー・オープンになります。したがって、キャッシュに項目を追加する前に、容量を適切な値に設定することが重要です。

連続キャッシュを使用する最も単純な方法は、append() と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);
}

キャッシュが一杯になった場合、新しいアイテムが追加またはプリペンドされたキャッシュの反対側の端にあるアイテムは削除されます。

要求された行が現在キャッシュされている項目からかなり離れている場合、insert() 関数を使用することで、この使用法をさらに最適化できます。新しい項目が挿入される場所と、現在キャッシュされている項目との間にギャップがある場合、キャッシュの連続性を保持するために、まず既存のキャッシュ項目が削除されます。そのため、insert() を使用する際には、キャッシュの不要なクリアを避けるために注意が必要です。

QContiguousCache クラスで有効なインデックスの範囲は、0 ~ INT_MAX です。最初のインデックスが 0 より小さくなるようにprepend() を呼び出したり、最後のインデックスが INT_MAX より大きくなるようにappend() を呼び出したりすると、キャッシュのインデックスが無効になることがあります。キャッシュ・インデックスが無効な場合は、containsIndex()、firstIndex()、lastIndex()、at()、operator[]() のいずれかを呼び出す前に、normalizeIndexes() を呼び出すことが重要である。キャッシュのインデックスが無効なときにこれらの関数を呼び出すと、未定義の動作になります。インデックスを確認するには、areIndexesValid() を使用します。

ほとんどの場合、インデックスが 0 から INT_MAX を超えることはなく、normalizeIndexes() を使用する必要はありません。

連続キャッシュの例を参照してください。

メンバ関数のドキュメント

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

指定されたcapacity でキャッシュを構築します。

setCapacity()も参照ください

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

other のコピーを構築します。

QContiguousCache は暗黙的に共有されるため、この操作には一定の時間がかかります。このため、関数から QContiguousCache を返すと非常に高速になります。共有インスタンスが変更された場合、それはコピーされ(copy-on-write)、線形時間がかかります。

operator=()も参照してください

QContiguousCache::~QContiguousCache()

キャッシュを破棄する。

void QContiguousCache::append(const T &value)

value をキャッシュの最後に挿入する。キャッシュが既に一杯の場合、キャッシュの先頭の項目は削除されます。

prepend()、insert()、isFull()も参照

bool QContiguousCache::areIndexesValid() const

キャッシュに格納されている項目のインデックスが有効かどうかを返す。インデックス位置 INT_MAX より後に項目が追加されたり、インデックス位置 0 より前に項目が追加されたりすると、インデックスが無効になることがある。インデックスは、normalizeIndexes()を呼び出すことで、再び有効にすることができる。

normalizeIndexes()、append()、prepend()も参照のこと

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

キャッシュ内のインデックス位置i にあるアイテムを返す。i はキャッシュ内の有効なインデックス位置でなければならない(すなわち、firstIndex() <=i <=lastIndex())。

キャッシュ内のインデックスは、そのアイテムがキャッシュに追加された最初のアイテムから何番目の位置にあるかを示す。つまり、容量100のキャッシュに150のアイテムが追加された場合、有効なインデックスの範囲は50から149になります。これにより、理論的な無限リストに基づいてキャッシュにアイテムを挿入したり取得したりすることができる。

firstIndex()、lastIndex()、insert()、operator[]()も参照のこと

qsizetype QContiguousCache::available() const

キャッシュが一杯になるまでに追加できる項目の数を返します。

size()、capacity() およびisFull()も参照

qsizetype QContiguousCache::capacity() const

キャッシュがいっぱいになるまでに格納できるアイテムの数を返します。キャッシュに容量と同じ数のアイテムが格納されている場合、新しいアイテムを追加すると、追加されたアイテムから最も遠いアイテムが削除されます。

setCapacity() およびsize()も参照ください

void QContiguousCache::clear()

キャッシュからすべての項目を削除します。容量は変更されません。

bool QContiguousCache::containsIndex(qsizetype i) const

キャッシュのインデックス範囲に指定されたインデックスi が含まれている場合は、true を返します。

firstIndex() およびlastIndex()も参照

qsizetype QContiguousCache::count() const

size() と同じ。

T &QContiguousCache::first()

キャッシュ内の最初の項目への参照を返します。この関数は、キャッシュが空でないことを前提とします。

last() およびisEmpty()も参照してください

const T &QContiguousCache::first() const

これはオーバーロードされた関数である。

qsizetype QContiguousCache::firstIndex() const

キャッシュ内の最初の有効なインデックスを返します。キャッシュが空の場合は、このインデックスは無効です。

capacity()、size() およびlastIndex()も参照

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

インデックス位置ivalue を挿入する。キャッシュにi の項目が既に含まれている場合、その値が置き換えられる。ilastIndex()より1つ多いか、firstIndex()より1つ少ない場合、それはappend()またはprepend()と等価である。

指定されたインデックスi がキャッシュの現在の範囲内でもなく、キャッシュのインデックス範囲の境界にも隣接していない場合、項目を挿入する前にまずキャッシュがクリアされる。この時点で、キャッシュのサイズは1になります。キャッシュの現在のインデックス範囲に隣接して始まる順序で項目を挿入するよう努力することは価値があります。

QContiguousCache クラスで有効なインデックスの範囲は、0 から INT_MAX です。この範囲外の挿入は未定義の動作をします。

prepend()、append()、isFull()、firstIndex()、lastIndex()も参照

bool QContiguousCache::isEmpty() const

キャッシュ内に項目が格納されていない場合はtrue を返す。

size() およびcapacity()も参照

bool QContiguousCache::isFull() const

キャッシュ内に格納されている項目の数がキャッシュの容量と等しい場合、true を返す。

size() およびcapacity()も参照

T &QContiguousCache::last()

キャッシュ内の最後の項目への参照を返します。この関数は、キャッシュが空でないことを前提とします。

first() およびisEmpty()も参照してください

const T &QContiguousCache::last() const

これはオーバーロードされた関数である。

qsizetype QContiguousCache::lastIndex() const

キャッシュ内の最後の有効なインデックスを返します。キャッシュが空の場合は、このインデックスは無効です。

capacity()、size() およびfirstIndex()も参照

void QContiguousCache::normalizeIndexes()

キャッシュの最初のインデックスと最後のインデックスを、有効なインデックスを指すように移動します。この関数は、キャッシュの内容やキャッシュ内の要素の順序を変更しない。

この関数は、キャッシュを循環バッファとして使用する際にインデックスのオーバーフローを修正できるように提供される。

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().

areIndexesValid()、append()、prepend()も参照のこと

void QContiguousCache::prepend(const T &value)

value をキャッシュの先頭に挿入する。キャッシュが既に一杯の場合、キャッシュの最後にある項目は削除されます。

append()、insert()、isFull()も参照

void QContiguousCache::removeFirst()

キャッシュから最初の項目を削除します。この関数は、キャッシュが空でないことを前提とします。

removeLast()も参照してください

void QContiguousCache::removeLast()

キャッシュから最後の項目を削除します。この関数は、キャッシュが空でないことを前提とします。

removeFirst()も参照してください

void QContiguousCache::setCapacity(qsizetype size)

キャッシュの容量を指定されたsize に設定します。キャッシュは、その容量と同じ数のアイテムを保持できます。キャッシュにアイテムを挿入、追加、またはプリペンドするとき、キャッシュがすでに一杯の場合は、追加されたアイテムから最も遠いアイテムが削除されます。

指定されたsize がキャッシュ内の現在の項目数よりも小さい場合、キャッシュの最後のsize 項目だけが残ります。

capacity() およびisFull()も参照

qsizetype QContiguousCache::size() const

キャッシュに含まれる項目の数を返します。

capacity()も参照ください

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

このキャッシュをother と交換する。この操作は非常に高速で、失敗することはない。

T QContiguousCache::takeFirst()

キャッシュ内の最初の項目を削除して返します。この関数は、キャッシュが空でないことを前提とします。

返り値を使用しない場合は、removeFirst() の方が効率的です。

takeLast() およびremoveFirst()も参照して ください。

T QContiguousCache::takeLast()

キャッシュ内の最後の項目を削除して返します。この関数は、キャッシュが空でないことを前提とします。

返り値を使用しない場合は、removeLast() の方が効率的です。

takeFirst() およびremoveLast()も参照して ください。

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

other がこのキャッシュと等しくない場合はtrue を返し、そうでない場合はfalse を返します。

2つのキャッシュが同じインデックスに同じ値を含む場合、等しいと見なされます。この関数は、operator==() を実装するための値型を必要とします。

operator==()も参照してください

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

Move-other をこのQContiguousCache インスタンスに割り当てる。

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

other をこのキャッシュに割り当て、このキャッシュへの参照を返します。

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

other がこのキャッシュと等しい場合はtrue を返し、そうでない場合はfalse を返します。

2つのキャッシュが同じインデックスに同じ値を含む場合、等しいと見なされます。この関数は、operator==() を実装するための値型を必要とします。

operator!=()も参照してください

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

インデックス位置i にある項目を変更可能な参照として返します。指定されたインデックス位置i の項目がキャッシュにない場合は、まずその位置に空の項目を挿入します。

ほとんどの場合、at() またはinsert() を使用する方がよいでしょう。

注意: operator[]のconstでないオーバーロードは、QContiguousCache 、ディープコピーを行う必要があります。nononstQContiguousCache への読み取り専用アクセスには、at() を使用する。

insert() およびat()も参照のこと

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

これはオーバーロードされた関数である。

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.