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

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

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: QList::insert (multi)  (Прочитано 30493 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 01, 2018, 07:56 »

Добрый день

С удивлением обнаружил что QList умеет вставлять только "по одному" - пришлось использовать вектор указателей. Не беда, но все-таки.. Или я плохо читал букварь?  Плиз "ткните носиком"

Спасибо
Записан
zhbr
Гость
« Ответ #1 : Октябрь 01, 2018, 09:52 »

 а что значит вставлять только по одному? есть же http://doc.qt.io/qt-5/qlist.html#append-1
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 01, 2018, 12:48 »

а что значит вставлять только по одному? есть же http://doc.qt.io/qt-5/qlist.html#append-1
append добавляет в конец (относительно легкая операция), а мне нужно в середину.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Октябрь 01, 2018, 15:06 »

Добрый день

С удивлением обнаружил что QList умеет вставлять только "по одному" - пришлось использовать вектор указателей. Не беда, но все-таки.. Или я плохо читал букварь?  Плиз "ткните носиком"

Спасибо

Кутишные контейнеры - говно, не надо их юзать. Особенно кулист
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #4 : Октябрь 01, 2018, 18:25 »

Добрый день

С удивлением обнаружил что QList умеет вставлять только "по одному" - пришлось использовать вектор указателей. Не беда, но все-таки.. Или я плохо читал букварь?  Плиз "ткните носиком"

Спасибо

Кутишные контейнеры - говно, не надо их юзать. Особенно кулист
Подробностей бы?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Октябрь 01, 2018, 19:06 »

могу за QVector сказать - он говно, тк. тормозит.
за QMultiMap - он говно, тк. есть проблемы, когда более 1 ключа с тем же значением.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #6 : Октябрь 01, 2018, 19:16 »

Кутишные контейнеры - говно, не надо их юзать. Особенно кулист
Подробностей бы?

Попробуйте скомпилять:
Код
C++ (Qt)
#include <list>
#include <QList>
 
class NonCopyable
{
public:
   NonCopyable(const NonCopyable&) = delete;
   NonCopyable(NonCopyable&&)      = default;
};
 
int main()
{
   std::list<NonCopyable> std_list;
   std_list.push_back(NonCopyable{});
 
   QList<NonCopyable> q_list;
   q_list.push_back(NonCopyable{});
}
Записан

Пока сам не сделаешь...
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #7 : Октябрь 01, 2018, 19:21 »

могу за QVector сказать - он говно, тк. тормозит.
за QMultiMap - он говно, тк. есть проблемы, когда более 1 ключа с тем же значением.

QVector тормозит при каких обстоятельствах? Если предварительно резерв делать, то не замечал тормозов.
Я QMultiMap заменяю на QMap<T1, QList<T2>>
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 02, 2018, 08:37 »

могу за QVector сказать - он говно, тк. тормозит.
Рискну предположить что как-то раз, возможно совершенно случайно, QVector был заменен на std::vector, и... (о чудо!) стало быстрее! Разбираться отчего да почему - та нафиг надо! Все и так ясно! QVector - говно! Этот вывод отложился в (под)сознании и стал непререкаемой истиной, ну а как же, ведь он основан на личном опыте ("своими глазами видел"). Хотя объективные подтверждения вряд ли найдутся, скорее всего "сам насвистел".

Увы, в основном из таких предрассудков и состоит наш "богатый опыт"  Улыбающийся

Кутишные контейнеры - говно, не надо их юзать. Особенно кулист
Опять примитивное швыряние говном (чужой опыт ничему не учит). Мне вот идея QList кажется весьма разумной, многие ситуации он покрывает, пусть не все. Да и в целом Qt контейнеры поприятнее stdухи. Есть конечно недочеты, напр не хватает хвункторов, ну это дело такое...

 

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Октябрь 02, 2018, 22:35 »

Подробностей бы?

вас в гугле забанили?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Октябрь 03, 2018, 01:16 »

Насчет тормозов вектора, есть бага на кутишном трекере.

А вот чем лист то не угодил? Вполне удобная и полезная конструкция...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Октябрь 03, 2018, 01:51 »

Насчет тормозов вектора, есть бага на кутишном трекере.

Ну там много смешных тикетов:)

А вот чем лист то не угодил? Вполне удобная и полезная конструкция...

Код:
auto img = loadImage(...);
QList<QImage> list;
list.append(img);

Сколько аллокаций в последней строке?

Код:
auto str = QStringLiteral("hello");
QList<QString> list;
list.append(str);

А тут?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Октябрь 03, 2018, 05:59 »

Сколько аллокаций в последней строке?
Для QString сработает как вектор (sizeof(QString) == sizeof(void *)), поэтому вероятно ни одной (пул). Размер QImage навскидку не помню, наверное > sizeof(void *) (если не так поправьте), поэтому кроме вставки в массив указателей будет еще и выделение блока для эл-та QImage - хотя это и не оптимально. Да, возможно для хранения QImage(й) оптимальнее QVector, особенно с учетом implicit шары. И что? Не вижу никаких оснований для "снисходительной иронии"  Улыбающийся (на базе сомнительной статьи).

А вот с сортировкой у QList нехорошо - месит данные, а ведь можно было сортировать массив указателей.

Ладно, предлагаю поговорить о том как вообще выбирать контейнер. Практически в любой задаче будет много векторов, простые данные, структуры (не классы) которых "много". Но если элемент что-то "выше травы" (класс) - то обычно, в большинстве случаев, приходится выделять для него блок памяти и хранить вектор указателей. Тогда вставка и удаление намного дешевле, и адреса эл-тов не "уплывут", Ну ясно ассоциативные контейнеры - своя песня, а так ничего другого-то и нет. Собсно это и обобщает QList - вполне нормально.

Помню Ваня тут все тьюториалы писал Улыбающийся, рекомендовал такой 2-мерный массив (псевдокод)
Цитировать
typedef vector<vector<T> > TArray2D;
Хотя с имплисит шарой и/или конструктором перемещения это и будет работать сносно - все-таки это не есть грамотно для вставок/удалений.

Попробуйте скомпилять:
Попробовал - не вышло (наверное компилятор староват). В чем суть-то?
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #13 : Октябрь 03, 2018, 08:23 »

Подробностей бы?

вас в гугле забанили?
По запросу "г...но" кутишные контейнеры не выдаются.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #14 : Октябрь 03, 2018, 13:06 »

Попробовал - не вышло (наверное компилятор староват). В чем суть-то?

С компилятором всё нормально(если он не совсем чудной какой-нибудь). Суть в том и есть, что нельзя в кутешный контейнер положить некопируемый объект.
Код
C++ (Qt)
   QVector<std::unique_ptr<MyClass>> q_vector;
   q_vector.append(std::make_unique<MyClass>());
 
Implicit sharing, которым кутешники так хвалятся, иногда боком выходит: выполняется копирование, когда об этом совсем не просят.
Записан

Пока сам не сделаешь...
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


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