Russian Qt Forum

Qt => Общие вопросы => Тема начата: Yegor от Октябрь 21, 2016, 19:26



Название: [РЕШЕНО] Сортировка QLinkedList
Отправлено: Yegor от Октябрь 21, 2016, 19:26
Всем здравствуйте!

У меня есть QLinkedList, который я хочу отсортировать. Пробую с помощью qSort.
Пишу, например:
Код
C++ (Qt)
QLinkedList<int> list;
list << 1 << 2 << 3;
qSort( list.begin(), list.end() );

При компиляции такого выдается много ошибок.
Если класс QLinkedList заменить на QList, то компиляция успешная.

Каким же образом сортировать QLinkedList? Подскажите, пожалуйста.
Спасибо!


Название: Re: Сортировка QLinkedList
Отправлено: Авварон от Октябрь 21, 2016, 20:01
QList - это на самом деле массив. Сортировать можно только контейнеры прямого доступа (QList, QVector).
Ответ - скопировать QLinkedList в масссив (напр, QVector), отсортировать его, скопировать обратно.


Название: Re: Сортировка QLinkedList
Отправлено: Igors от Октябрь 22, 2016, 04:15
Каким же образом сортировать QLinkedList?
Может стоит использовать std::list который имеет метод sort, причем хитрый - адрес элемента не меняется, т.е. такая сортировка намного эффективнее. К сожалению, для QLinkedList такого же метода не видно. Ну зато есть удобный соскок в std и обратно (from/toStdList)


Название: Re: Сортировка QLinkedList
Отправлено: Yegor от Октябрь 22, 2016, 10:03
Как по мне, удобное решение сделать временный QList и отсортировать его. А потом перезаполнить QLinkedList из этого QList. Хотя и решение с std::list более целесообразное.

Спасибо большое всем за помощь!


Название: Re: Сортировка QLinkedList
Отправлено: Igors от Октябрь 22, 2016, 15:48
Как по мне, удобное решение сделать временный QList и отсортировать его. А потом перезаполнить QLinkedList из этого QList.
Возможно еще решение - не трогать QLinkedList, пусть адреса эл-тов там не меняются. А нужна сортировка - сделать контейнер указателей и его сортировать. Это заметно быстрее для приличных эл-тов и в духе "списка", обычно его и заводят чтобы эл-ты не дергать. Правда за это придется заплатить еще контейнером.