Russian Qt Forum
Ноябрь 24, 2024, 23:14
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Общий
>
Хранение selection
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Хранение selection (Прочитано 5874 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Хранение selection
«
:
Январь 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
Сообщений: 245
Re: Хранение selection
«
Ответ #1 :
Январь 14, 2022, 11:58 »
В qt QList это вектор. Вставка в середину за O(n). В чём его преимущество?
https://doc.qt.io/qt-5/qlist.html
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Хранение selection
«
Ответ #2 :
Январь 14, 2022, 12:18 »
Цитата: qtkoder777 от Январь 14, 2022, 11:58
В qt QList это вектор. Вставка в середину за O(n). В чём его преимущество?
https://doc.qt.io/qt-5/qlist.html
QList вектор для типов sizeof <= sizeof(void *), напр int, QString и др. Для остальных это аналог std::vector<T *>, т.е. хранится вектор указателей на неперемещаемые данные.
Ну вот, теплилась (слабая) надежда что-то услышать/почерпнуть, хоть какие-то "идеи", а все сразу сваливается в жевание (замшелой) матчасти
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Хранение selection
«
Ответ #3 :
Январь 14, 2022, 15:34 »
Цитата: Igors от Январь 14, 2022, 11:41
Заменить QList на вектор не могу, CInstance должен быть неперемещаемым.
это очень хреновый дизайн
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Хранение selection
«
Ответ #4 :
Январь 14, 2022, 15:59 »
Цитата: Авварон от Январь 14, 2022, 15:34
это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Хранение selection
«
Ответ #5 :
Январь 14, 2022, 16:06 »
Цитата: Igors от Январь 14, 2022, 15:59
Цитата: Авварон от Январь 14, 2022, 15:34
это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?
в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Хранение selection
«
Ответ #6 :
Январь 14, 2022, 16:11 »
Цитата: Авварон от Январь 14, 2022, 16:06
в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
Хорошо, меняем QList<CInstance> на std::vector<CInstance *> или даже (извращенных) юников. Ну и какая разница? Индекс-то все равно не получить
Записан
qtkoder777
Частый гость
Offline
Сообщений: 245
Re: Хранение selection
«
Ответ #7 :
Январь 18, 2022, 23:22 »
Цитата: Авварон от Январь 14, 2022, 16:06
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
А в qt7 сломается совсем всё. Жопа при смене версии - главная отличительная черта QT.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Хранение selection
«
Ответ #8 :
Январь 19, 2022, 00:51 »
что мешает сделать сет индексов?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Хранение selection
«
Ответ #9 :
Январь 19, 2022, 11:52 »
Цитата: Авварон от Январь 19, 2022, 00:51
что мешает сделать сет индексов?
А как его "засисять"? С указателями все просто - обеспечить удаление только из владельца (MyClass), там же вычеркнуть из selection
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Хранение selection
«
Ответ #10 :
Январь 22, 2022, 06:17 »
Цитата: Авварон от Январь 14, 2022, 16:06
нужна стабильность - храните вектор юников
Кстати всегда рассматриваю этот вариант когда завожу контейнеры. Типа
Цитировать
Голый указатель - зло! Все должно быть юником или шаредом
Или эта мода уже прошла?
В данном случае (как и во многих других) никаких оснований для вумных указателей не увидел. Сделать юниками конечно нетрудно, но зачем притворяться что "делаем" если нет?
Ну тогда можно хранить selection как weak - невелико достижение, к тому же, как всегда, нужно чистить сдохшие weak.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Хранение selection
«
Ответ #11 :
Январь 24, 2022, 14:06 »
Ну варианта у вас 2 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Хранение selection
«
Ответ #12 :
Январь 24, 2022, 14:18 »
Цитата: Авварон от Январь 24, 2022, 14:06
Ну варианта у вас 2 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля.
Первый вариант - то что сейчас. Второй - в чистом виде "корявая архитектура" (так говорят часто, понимают редко). Это надо надо найти
все
места где "меняется" и везде исправить. А сколько их и где они - хз даже в не таком уж большом проекте. И надо поддерживать это для всех новых "изменений". На это надо идти только в крайнем случае. Нет ли возможности кешировать автоматом/пулеметом ?
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...