QContiguousCache 类
template <typename T> class QContiguousCacheQContiguousCache 类是一个提供连续缓存的模板类。更多...
头文件 | #include <QContiguousCache> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 所有成员的列表,包括继承的成员
- QContiguousCache 是 隐式共享类 的一部分。
注意: 此类中的所有函数都是 可重入的。
公共函数
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=(const QContiguousCache<T> &other) |
QContiguousCache<T> & | operator=(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。当使用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()
返回对缓存中第一个项的引用。此函数假设缓存不为空。
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 减一,则等价于一个 append 或 prepend。
如果给定的索引 i 不在缓存的当前索引范围内,或者紧邻缓存的索引范围边界,则插入项之前先清除缓存。在这种情况下,缓存的大小将为 1。在缓存中插入项时,请努力以从当前索引范围附近开始的方式插入项。
QContiguousCache 类的有效索引范围是从 0 到 INT_MAX。在此范围之外插入将产生未定义的行为。
另请参阅 prepend(),append(),isFull(),firstIndex() 和 lastIndex。
bool QContiguousCache::isEmpty() const
如果没有在缓存中存储项,则返回 true
。
bool QContiguousCache::isFull() const
如果缓存中存储的项目数量等于缓存的容量,则返回 true
。
T &QContiguousCache::last()
返回缓存中最后一个项的引用。此函数假定缓存不为空。
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 个项目。
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 下不包含项目,则它将首先在该位置插入一个空项目。
注意:此非 const 重载的 operator[] 需要 QContiguousCache 进行深度复制。请使用 at() 以仅对非 const QContiguousCache 进行只读访问。
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. 的商标。所有其他商标均为其各自所有者的财产。