QContiguousCache 类

template <typename T> class QContiguousCache

QContiguousCache 类是一个提供连续缓存的模板类。更多...

头文件 #include <QContiguousCache>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意: 此类中的所有函数都是 可重入的

公共函数

QContiguousCache(qsizetype capacity = 0)
QContiguousCache(const QContiguousCache<T> &other)
~QContiguousCache()
voidappend(const T &value)
boolareIndexesValid() const
const T &at(qsizetype i) const
qsizetypeavailable() const
qsizetypecapacity() const
voidclear()
boolcontainsIndex(qsizetype i) const
qsizetypecount() const
T &first()
const T &first() const
qsizetypefirstIndex() const
voidinsert(qsizetype i, const T &value)
boolisEmpty() const
boolisFull() const
T &last()
const T &last() const
qsizetypelastIndex() const
voidnormalizeIndexes()
voidprepend(const T &value)
voidremoveFirst()
voidremoveLast()
voidsetCapacity(qsizetype size)
qsizetypesize() const
voidswap(QContiguousCache<T> &other)
TtakeFirst()
TtakeLast()
booloperator!=(const QContiguousCache<T> &other) const
QContiguousCache<T> &operator=(const QContiguousCache<T> &other)
QContiguousCache<T> &operator=(QContiguousCache<T> &&other)
booloperator==(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。当使用prepend()使第一个索引小于0或使用append()使最后一个索引大于INT_MAX时,将会导致缓存索引无效。当缓存索引无效时,在调用任何containsIndex()、firstIndex()、lastIndex()、at()或operator[]之前,需要首先调用normalizeIndexes()。如果在缓存索引无效时调用这些函数,将会导致未定义的行为。可以使用areIndexesValid()来检查索引。

在大多数情况下,索引不会超出0到INT_MAX,而且不需要使用normalizeIndexes()。

请参阅连续缓存示例。

成员函数文档

[显式] 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)

将值 value 插入索引位置 i。如果缓存在 i 处已包含项,则该值会被替换。如果 i 等于 lastIndex 加一或者 firstIndex 减一,则等价于一个 appendprepend

如果给定的索引 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

如果两个缓存在同一索引下包含相同的值,则认为它们是相等的。此函数要求值类型实现 operator==()

另请参阅operator==().

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

other 分配给此缓存并返回对此缓存的引用。

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

other 移动分配到此 QContiguousCache 实例。

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

如果 other 与此缓存相等,则返回 true;否则返回 false

如果两个缓存在同一索引下包含相同的值,则认为它们是相等的。此函数要求值类型实现 operator==()

另请参阅operator!=().

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

返回索引位置 i 的项目作为可修改的引用。如果缓存在该指定索引位置 i 下不包含项目,则它将首先在该位置插入一个空项目。

在大多数情况下,最好使用 at() 或 insert()。

注意:此非 const 重载的 operator[] 需要 QContiguousCache 进行深度复制。请使用 at() 以仅对非 const QContiguousCache 进行只读访问。

另请参阅insert() 和 at().

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

这是一个重载函数。

等同于 at(i)。

© 2024 The Qt Company Ltd. 本文档中包含的贡献的文档版权属于其各自的所有者。本提供的文档根据 Free Software Foundation 发布的 GNU 自由文档许可证第 1.3 版 的条款获得许可。Qt 和相关徽标是芬兰和/或全球其他地区的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。