QContiguousCache Class
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=(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()를 통해 설정되거나 생성자에 매개변수로 전달되는 고정된 용량을 기반으로 작동합니다. 이 용량은 캐시 자체가 사용하는 메모리의 상한선이며, 요소 자체에 의해 할당된 메모리는 포함되지 않습니다. 용량이 0인 캐시(기본값)는 항목이 저장되지 않음을 의미합니다. 즉, 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()
캐시의 첫 번째 항목에 대한 참조를 반환합니다. 이 함수는 캐시가 비어 있지 않다고 가정합니다.
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()보다 1 더 크거나 firstIndex()보다 1 더 작은 경우, 이는 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 개 항목만 남게 됩니다.
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==()도 참조하십시오 .
[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`를 반환합니다.
두 캐시는 동일한 인덱스에 동일한 값을 포함하고 있을 때 동일한 것으로 간주됩니다. 이 함수를 사용하려면 값 유형이 ` operator==()`을 구현해야 합니다.
operator!=()도 참조하십시오 .
T &QContiguousCache::operator[](qsizetype i)
i 인덱스 위치에 있는 항목을 수정 가능한 참조로 반환합니다. 캐시에 i 지정된 인덱스 위치에 항목이 없는 경우, 먼저 해당 위치에 빈 항목을 삽입합니다.
대부분의 경우 at() 또는 insert()을 사용하는 것이 더 좋습니다.
참고: 이 non-const 오버로드된 operator[]는 QContiguousCache 를 통해 심층 복사를 수행해야 합니다. non-const QContiguousCache 에 대한 읽기 전용 액세스를 위해서는 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.