Здравствуйте, sergii.p, Вы писали:
SP>Здравствуйте, Hоmunculus, Вы писали:
H>>Есть такое? Или свой велосипед городить?
SP>можно реализовать поверх QSharedData (как минимум detach не надо будет самому писать). Хотя всё равно придётся заморочиться с итераторами, конструкторами и пр.
SP>SP>constexpr int PageSize = 1024;
SP>template<typename T>
SP>struct Page : QSharedData
SP>{
SP> Page() : data(PageSize) {}
SP> QVector<T> data;
SP>};
SP>template<typename T>
SP>struct PagedArray
SP>{
SP> explicit PagedArray(int size = 0)
SP> : m_size(size)
SP> {
SP> const int pageCount = (size + PageSize - 1) / PageSize;
SP> m_pages.resize(pageCount);
SP> for (int i = 0; i < pageCount; ++i)
SP> m_pages[i] = QSharedDataPointer<Page<T>>(new Page<T>());
SP> }
SP> int size() const noexcept { return m_size; }
SP> const T& operator[](int index) const
SP> {
SP> int pageIndex = index / PageSize;
SP> int offset = index % PageSize;
SP> return m_pages[pageIndex]->data[offset];
SP> }
SP> T& operator[](int index)
SP> {
SP> int pageIndex = index / PageSize;
SP> int offset = index % PageSize;
SP> if (m_pages[pageIndex].data()->ref.loadRelaxed() > 1)
SP> m_pages[pageIndex].detach();
SP> return m_pages[pageIndex]->data[offset];
SP> }
SP> void resize(int newSize)
SP> {
SP> const int newPageCount = (newSize + PageSize - 1) / PageSize;
SP> m_pages.resize(newPageCount);
SP> for (int i = 0; i < newPageCount; ++i)
SP> {
SP> if (!m_pages[i])
SP> m_pages[i] = QSharedDataPointer<Page<T>>(new Page<T>());
SP> }
SP> m_size = newSize;
SP> }
SP>private:
SP> int m_size;
SP> QVector<QSharedDataPointer<Page<T>>> m_pages;
SP>};
SP>
Вы только забыли про то, что QSharedData изначально спроектирован с прицелом на многопоточность. А в такой примерной реализации нужно будет позаморачиваться.