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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QList + qSort  (Прочитано 24288 раз)
shadone
Гость
« Ответ #15 : Сентябрь 28, 2009, 12:22 »

хрен пойму почему в данном случае не использовать QList <CTest*> ?
Потому что qSort требует оператор < а для <CTest*> он будет сравнивать указатели - т.е. делать совсем не то что нужно
можно определить свой функтор для сравнения (последний аргумент qLess , либо глобальный operator<(CTest*, CTest*)

Цитировать
кстати хороший вопрос откуда они берутся. Скорее всего из-за создание временного объекта на стеке и в релизной сборке этих деструкторов вероятно не будет...
будет, деструктор для временного CTest должен вызываться по окончании theList.append
не обязательно - по стандарту в данном случае т.к. функция принимает константную ссылку и пользователь передает временный объект, компилятор имеет право продлить жизнь и не создавать еще одну копию.
Записан
shadone
Гость
« Ответ #16 : Сентябрь 28, 2009, 12:24 »

хороший вопрос и отличная возможность показать себя и вписать свое имя в историю - ждем патчей реализующий специализацию template<typename Container> void qSort(Container &container) для QList. Кто возьмется?
Никто кроме Qt, потому что все глухо "private" (обратная сторона медали). Этот feature request я им уже написал
Qt разрабатывается открыто и легко принимается сторонний код.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Сентябрь 28, 2009, 12:56 »

можно определить свой функтор для сравнения (последний аргумент qLess , либо глобальный operator<(CTest*, CTest*)
Ну такой глобальный оператор определять стремно и не хочется. А про функтор и qLess покажите как это делается если есть возможность (просто интересно).

Конечно, если нужно сортировать быстрее, выкрутиться можно, например так

Код:
QVector <CTest *> theVec;
...
// заполняем вектор
theVec.push_back(new CTest());
...
qsort(&theVec[0], theVec.size(), sizeof(CTest *), CompTestPtr);   

И это наверняка не один способ. Но по-моему главное в контейнерах это УДОБСТВО их использования, а здесь этого нет. Так что пусть пишут QList::sort  Улыбающийся
Записан
shadone
Гость
« Ответ #18 : Сентябрь 28, 2009, 13:04 »

можно определить свой функтор для сравнения (последний аргумент qLess , либо глобальный operator<(CTest*, CTest*)
Ну такой глобальный оператор определять стремно и не хочется. А про функтор и qLess покажите как это делается если есть возможность (просто интересно).
Это есть в документации: http://doc.qt.nokia.com/4.5/qtalgorithms.html#qSort-2

Конечно, если нужно сортировать быстрее, выкрутиться можно, например так

Код:
QVector <CTest *> theVec;
...
// заполняем вектор
theVec.push_back(new CTest());
...
qsort(&theVec[0], theVec.size(), sizeof(CTest *), CompTestPtr);  
это совершенно не быстрее. Перемещение элементов в QVector всегда будет медленнее - см описание сложностей алгоритмов над разными контейнерами - http://doc.qt.nokia.com/4.5/containers.html#algorithmic-complexity
ах, не заметил что в данном случае операция идет не над вектором а над линейным блоком памяти.
И это наверняка не один способ. Но по-моему главное в контейнерах это УДОБСТВО их использования, а здесь этого нет. Так что пусть пишут QList::sort  Улыбающийся
"пусть пишут" это неконструктивно Улыбающийся
О чем я говорю - вы можете сделать Qt лучше, написав патч для Qt реализующий специализацию qSort для контейнера QList и послав патч разработчикам Qt, сделав доброе дело для всех пользоваталей библиотеки и запечатлев свое имя в истории (имя автора патча будет видно всем в истории коммитов Qt).
« Последнее редактирование: Сентябрь 28, 2009, 13:06 от ddenis » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Сентябрь 28, 2009, 14:09 »

Это есть в документации: http://doc.qt.nokia.com/4.5/qtalgorithms.html#qSort-2
Ага, спасибо, этот путь короче для QList<CTest *>
"пусть пишут" это неконструктивно Улыбающийся
Вообще говоря - неконструктивно. Но в данном конкретном случае дописать этот метод для QList - дело 5 минут и текст моего патча был бы ни к чему. Просто я не могу сделать это сам из-за private, пришлось подарить им идею  Улыбающийся
Записан
shadone
Гость
« Ответ #20 : Сентябрь 28, 2009, 15:13 »

Это есть в документации: http://doc.qt.nokia.com/4.5/qtalgorithms.html#qSort-2
Ага, спасибо, этот путь короче для QList<CTest *>
"пусть пишут" это неконструктивно Улыбающийся
Вообще говоря - неконструктивно. Но в данном конкретном случае дописать этот метод для QList - дело 5 минут и текст моего патча был бы ни к чему. Просто я не могу сделать это сам из-за private, пришлось подарить им идею  Улыбающийся
лучше дарить идеи оформленные в виде патча Улыбающийся согласен что патч не сложный, но реализовать его в виде метода QList::sort некорректно - т.к. потребуется изменять уже существующие приложния чтобы получить преимущество от этой новой фичи. вместо этого правильный подход был бы сделать специализацию шаблона qSort для QList (причем две специализации - для случае когда передается контейнер и когда передается часть контейнера через итераторы). Плюс надо написать юнит-тесты. Вся эта работа несложная, но не на 5 минут.

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

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Сентябрь 28, 2009, 15:53 »

лучше дарить идеи оформленные в виде патча Улыбающийся согласен что патч не сложный, но реализовать его в виде метода QList::sort некорректно - т.к. потребуется изменять уже существующие приложния чтобы получить преимущество от этой новой фичи. вместо этого правильный подход был бы сделать специализацию шаблона qSort для QList (причем две специализации - для случае когда передается контейнер и когда передается часть контейнера через итераторы). Плюс надо написать юнит-тесты. Вся эта работа несложная, но не на 5 минут.

ждем вашего патча Подмигивающий
"Инициатива наказуема исполнением" Улыбающийся  Но я с Вами не согласен по всем позициям:

1) То, что QList мог бы сортировать быстрее = глухая специфика/свойство QList который держит массив указателей, для других контейнеров это смысла не имеет. Поэтому нужен метод QList::sort, а не  специализация шаблона для одного класса.

2) Изменять функциональность существующих/работающих программ (пусть даже из благих побуждений) всегда чревато неприятными последствиями. Результаты 2 сортировок НЕ равны, например кто-то мог рассчитывать что объекты будут перемещены. Поэтому qSort надо оставить как есть.

3) Хорошо (удобно для разработчика) поставленная задача весит гораздо больше чем масса примеров и кода. QList::sort сделать очень просто а результат был бы налицо, легко понятен и документируем.

Ну и вообще, я к славе не стремлюсь  Улыбающийся
Записан
shadone
Гость
« Ответ #22 : Сентябрь 28, 2009, 16:25 »

"Инициатива наказуема исполнением" Улыбающийся  Но я с Вами не согласен по всем позициям:

1) То, что QList мог бы сортировать быстрее = глухая специфика/свойство QList который держит массив указателей, для других контейнеров это смысла не имеет. Поэтому нужен метод QList::sort, а не  специализация шаблона для одного класса.
сорри, но логики здесь не вижу - есть единый интерфейс для сортировки любых отрезков(range)/контейнеров, и пользователю этого api совершенно не нужно знать что в некоторых случаях для конкретного типа контейнера используется более оптимальный алгоритм.

2) Изменять функциональность существующих/работающих программ (пусть даже из благих побуждений) всегда чревато неприятными последствиями. Результаты 2 сортировок НЕ равны, например кто-то мог рассчитывать что объекты будут перемещены. Поэтому qSort надо оставить как есть.

элементы _будут_ перемещены, просто не будет дополнительных временных объектов. Имхо если пользователь рассчитывает на определенное количество вызовов конструкторов/деструкторов - он сам ищет себе проблемы.

3) Хорошо (удобно для разработчика) поставленная задача весит гораздо больше чем масса примеров и кода. QList::sort сделать очень просто а результат был бы налицо, легко понятен и документируем.

Ну и вообще, я к славе не стремлюсь  Улыбающийся

ок Улыбающийся я себе записал эту проблемку в список задачек над которыми надо подумать, надеюсь в 4.7 реализую.
Записан
ритт
Гость
« Ответ #23 : Сентябрь 28, 2009, 18:35 »

Qt разрабатывается открыто и легко принимается сторонний код.
угу, легко. но порой доо..оолго Улыбающийся
Записан
shadone
Гость
« Ответ #24 : Сентябрь 28, 2009, 18:41 »

Qt разрабатывается открыто и легко принимается сторонний код.
угу, легко. но порой доо..оолго Улыбающийся
Подмигивающий ну ты я думаю знаешь причины - обязательное сканирование кода (полу-)автоматизированной системой на предмет патентных ограничений, ручной ревью кода и общая загруженность разработчиков...
Записан
udovolstvie
Гость
« Ответ #25 : Март 01, 2010, 15:03 »

Здравствуйте.
У меня похожая проблема,
может быть знаете её решение.
Описан класс V1, в нем определен оператор
bool operator<(const V1&rh){if (this==&rh) return false;else if (x<rh.x && y<rh.y && z<rh.z) return true; else return false;}

пытаюсь скомпилировать, ругается:
Error   2   error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Core2::V1' (or there is no acceptable conversion)   C:\Qt\4.6.0\include\QtCore\qalgorithms.h   161   RFCore

что не так?

upd:====
надо было
bool operator<(const V1&rh) const {if (this==&rh) return false;else if (x<rh.x && y<rh.y && z<rh.z) return true; else return false;}
« Последнее редактирование: Март 01, 2010, 17:21 от udovolstvie » Записан
shadone
Гость
« Ответ #26 : Март 01, 2010, 15:10 »

const?
Записан
BigZ
Гость
« Ответ #27 : Март 02, 2010, 09:55 »

Qt разрабатывается открыто и легко принимается сторонний код.
угу, легко. но порой доо..оолго Улыбающийся
Подмигивающий ну ты я думаю знаешь причины - обязательное сканирование кода (полу-)автоматизированной системой на предмет патентных ограничений, ручной ревью кода и общая загруженность разработчиков...
Я прошу прощения что вмешиваюсь не по теме,
но просто стало интересно - что это "обязательное сканирование кода (полу-)автоматизированной системой на предмет патентных ограничений"? Как работает и что даёт?
Записан
shadone
Гость
« Ответ #28 : Март 02, 2010, 12:43 »

Я прошу прощения что вмешиваюсь не по теме,
но просто стало интересно - что это "обязательное сканирование кода (полу-)автоматизированной системой на предмет патентных ограничений"? Как работает и что даёт?
я не знаю как конкретно это работает - какая-то система которая снанирует принимаемый код на предмет наличия запатентованных кусков кода или кода из сторонних проектов (pattern analysis вероятно). Что дает - замедляет прием больших патчей как минимум на пару недель Подмигивающий
Записан
BigZ
Гость
« Ответ #29 : Март 02, 2010, 12:52 »

Я прошу прощения что вмешиваюсь не по теме,
но просто стало интересно - что это "обязательное сканирование кода (полу-)автоматизированной системой на предмет патентных ограничений"? Как работает и что даёт?
я не знаю как конкретно это работает - какая-то система которая снанирует принимаемый код на предмет наличия запатентованных кусков кода или кода из сторонних проектов (pattern analysis вероятно). Что дает - замедляет прием больших патчей как минимум на пару недель Подмигивающий
Интересно, ни когда про такое не слышал.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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