このページでは

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 クラスは、ユーザー インターフェイス ビューに表示するために、T 型の項目をキャッシュする効率的な方法を提供します。QCache とは異なり、キャッシュ内の要素が連続しているという制限が追加されています。これにより、ユーザーインターフェースのビューが、現在のスクロール位置周辺の一連の行としてデータを要求するという最も一般的な方法に合致するという利点があります。この制限により、QCache よりもキャッシュのメモリ消費量とプロセッササイクルを削減できます。

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

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

キャッシュが満杯の場合、新しい項目が末尾または先頭に追加される位置からキャッシュの反対側にある項目が削除されます。

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

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

ほとんどの場合、インデックスは 0 から INT_MAX の範囲内にとどまるため、normalizeIndexes() を使用する必要はありません。

「Contiguous Cache」の例を参照してください。

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

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

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

setCapacity()も参照してください 。

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

other のコピーを作成します。

QContiguousCacheは暗黙的に共有されているため、この操作は定数時間を要します。これにより、関数からQContiguousCacheを返す処理は非常に高速になります。共有されているインスタンスが変更された場合、そのインスタンスはコピーされます(コピー・オン・ライト)が、これには線形時間がかかります。

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)

インデックス位置i にvalue を挿入します。キャッシュにすでにi の項目が含まれている場合、その値は上書きされます。i がlastIndex() より 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)

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() を使用する方が望ましいです。

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

insert() およびat()も参照してください 。

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

(i) と同様です。

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

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