Russian Qt Forum
Март 29, 2024, 09:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Хранение selection  (Прочитано 4541 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Январь 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 ?

Спасибо
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #1 : Январь 14, 2022, 11:58 »

В qt QList это вектор. Вставка в середину за O(n). В чём его преимущество?
https://doc.qt.io/qt-5/qlist.html
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 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 *>, т.е. хранится вектор указателей на неперемещаемые данные.

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

Сообщений: 3257


Просмотр профиля
« Ответ #3 : Январь 14, 2022, 15:34 »

Заменить QList на вектор не могу, CInstance должен быть неперемещаемым.

это очень хреновый дизайн
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 14, 2022, 15:59 »

это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #5 : Январь 14, 2022, 16:06 »

это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?  Улыбающийся

в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 14, 2022, 16:11 »

в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
Хорошо, меняем QList<CInstance> на std::vector<CInstance *> или даже (извращенных) юников. Ну и какая разница? Индекс-то все равно не получить
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #7 : Январь 18, 2022, 23:22 »

спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
А в qt7 сломается совсем всё. Жопа при смене версии - главная отличительная черта QT.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #8 : Январь 19, 2022, 00:51 »

что мешает сделать сет индексов?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 19, 2022, 11:52 »

что мешает сделать сет индексов?
А как его "засисять"? С указателями все просто - обеспечить удаление только из владельца (MyClass), там же вычеркнуть из selection
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Январь 22, 2022, 06:17 »

нужна стабильность - храните вектор юников
Кстати всегда рассматриваю этот вариант когда завожу контейнеры. Типа
Цитировать
Голый указатель - зло! Все должно быть юником или шаредом
Или эта мода уже прошла?  Улыбающийся

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

Сообщений: 3257


Просмотр профиля
« Ответ #11 : Январь 24, 2022, 14:06 »

Ну варианта у вас 2 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Январь 24, 2022, 14:18 »

Ну варианта у вас 2 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля.
Первый вариант - то что сейчас. Второй - в чистом виде "корявая архитектура" (так говорят часто, понимают редко). Это надо надо найти все места где "меняется" и везде исправить. А сколько их и где они - хз даже в не таком уж большом проекте. И надо поддерживать это для всех новых "изменений". На это надо идти только в крайнем случае. Нет ли возможности кешировать автоматом/пулеметом ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 23.