Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Январь 14, 2022, 11:41



Название: Хранение selection
Отправлено: Igors от Январь 14, 2022, 11:41
Добрый день

Класс имеет контейнер, размер может быть значителен. напр 100K. Эл-ты контейнера могут быть selected и подсвечиваться в UI. Недолго думая я сделал так
Код
C++ (Qt)
class MyClass {
...
 QList<CInstance> mInstances;
 QSet<CInstance *> mSelectedInst;
...
};
 
Правда сам CInstance не может сказать он selected или нет, нужен MyClass. Ну и ладно, зато операции с selection вполне удобны.

Но через какое-то время нарисовалась проблемка - ряд операций (напр запись undo) требует индексы selection. Заменить QList на вектор не могу, CInstance должен быть неперемещаемым. Приходится искать индексы перебором, что конечно "не украшает" на 100K и более.

Есть мысли как лучше организовать selection ?

Спасибо


Название: Re: Хранение selection
Отправлено: qtkoder777 от Январь 14, 2022, 11:58
В qt QList это вектор. Вставка в середину за O(n). В чём его преимущество?
https://doc.qt.io/qt-5/qlist.html


Название: Re: Хранение selection
Отправлено: Igors от Январь 14, 2022, 12:18
В qt QList это вектор. Вставка в середину за O(n). В чём его преимущество?
https://doc.qt.io/qt-5/qlist.html
QList вектор для типов sizeof <= sizeof(void *), напр int, QString и др. Для остальных это аналог std::vector<T *>, т.е. хранится вектор указателей на неперемещаемые данные.

Ну вот, теплилась (слабая) надежда что-то услышать/почерпнуть, хоть какие-то "идеи", а все сразу сваливается в жевание (замшелой) матчасти :'(


Название: Re: Хранение selection
Отправлено: Авварон от Январь 14, 2022, 15:34
Заменить QList на вектор не могу, CInstance должен быть неперемещаемым.

это очень хреновый дизайн


Название: Re: Хранение selection
Отправлено: Igors от Январь 14, 2022, 15:59
это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?  :)


Название: Re: Хранение selection
Отправлено: Авварон от Январь 14, 2022, 16:06
это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?  :)

в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников


Название: Re: Хранение selection
Отправлено: Igors от Январь 14, 2022, 16:11
в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
Хорошо, меняем QList<CInstance> на std::vector<CInstance *> или даже (извращенных) юников. Ну и какая разница? Индекс-то все равно не получить


Название: Re: Хранение selection
Отправлено: qtkoder777 от Январь 18, 2022, 23:22
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
А в qt7 сломается совсем всё. Жопа при смене версии - главная отличительная черта QT.


Название: Re: Хранение selection
Отправлено: Авварон от Январь 19, 2022, 00:51
что мешает сделать сет индексов?


Название: Re: Хранение selection
Отправлено: Igors от Январь 19, 2022, 11:52
что мешает сделать сет индексов?
А как его "засисять"? С указателями все просто - обеспечить удаление только из владельца (MyClass), там же вычеркнуть из selection


Название: Re: Хранение selection
Отправлено: Igors от Январь 22, 2022, 06:17
нужна стабильность - храните вектор юников
Кстати всегда рассматриваю этот вариант когда завожу контейнеры. Типа
Цитировать
Голый указатель - зло! Все должно быть юником или шаредом
Или эта мода уже прошла?  :)

В данном случае (как и во многих других) никаких оснований для вумных указателей не увидел. Сделать юниками конечно нетрудно, но зачем притворяться что "делаем" если нет?  :) Ну тогда можно хранить selection как weak - невелико достижение, к тому же, как всегда, нужно чистить сдохшие weak.


Название: Re: Хранение selection
Отправлено: Авварон от Январь 24, 2022, 14:06
Ну варианта у вас 2 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля.


Название: Re: Хранение selection
Отправлено: Igors от Январь 24, 2022, 14:18
Ну варианта у вас 2 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля.
Первый вариант - то что сейчас. Второй - в чистом виде "корявая архитектура" (так говорят часто, понимают редко). Это надо надо найти все места где "меняется" и везде исправить. А сколько их и где они - хз даже в не таком уж большом проекте. И надо поддерживать это для всех новых "изменений". На это надо идти только в крайнем случае. Нет ли возможности кешировать автоматом/пулеметом ?