Название: Хранение selection Отправлено: Igors от Январь 14, 2022, 11:41 Добрый день
Класс имеет контейнер, размер может быть значителен. напр 100K. Эл-ты контейнера могут быть selected и подсвечиваться в UI. Недолго думая я сделал так Код Правда сам 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). В чём его преимущество? QList вектор для типов sizeof <= sizeof(void *), напр int, QString и др. Для остальных это аналог std::vector<T *>, т.е. хранится вектор указателей на неперемещаемые данные. https://doc.qt.io/qt-5/qlist.html Ну вот, теплилась (слабая) надежда что-то услышать/почерпнуть, хоть какие-то "идеи", а все сразу сваливается в жевание (замшелой) матчасти :'( Название: 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. Хорошо, меняем QList<CInstance> на std::vector<CInstance *> или даже (извращенных) юников. Ну и какая разница? Индекс-то все равно не получитьспойлер - в qt6 все сломается нужна стабильность - храните вектор юников Название: 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 - либо не кешировать индексы и перебирать при обращении. Либо кешировать и перебирать кеш индексов при изменении. Осталось понять какие операции выполняются чаще, какие реже и вуаля. Первый вариант - то что сейчас. Второй - в чистом виде "корявая архитектура" (так говорят часто, понимают редко). Это надо надо найти все места где "меняется" и везде исправить. А сколько их и где они - хз даже в не таком уж большом проекте. И надо поддерживать это для всех новых "изменений". На это надо идти только в крайнем случае. Нет ли возможности кешировать автоматом/пулеметом ? |