QContiguousCache Class

template <typename T> class QContiguousCache

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

Header: #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)

i のインデックス位置にvalue を挿入します。キャッシュに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) と同じです。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。