Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Serega от Май 06, 2015, 09:50



Название: qStableSort - расположение своего функтора
Отправлено: Serega от Май 06, 2015, 09:50
Помогите пожалуйста разобраться. В таком виде код работает:
Код
C++ (Qt)
#include "story.h"
 
bool caseInsensitiveLessThan(const QString &s1, const QString &s2)
{
   return s1.toLower() < s2.toLower();
}
 
void Story::importFromClipboard(const QStringList &list)
{  
 qStableSort(list.begin(), list.end(), caseInsensitiveLessThan);
}

Если функтор пытаюсь сделать членом класса, story.h:
Код
C++ (Qt)
#include <QObject>
#include <QString>
#include <QStringList>
#include <QtAlgorithms>
 
class Story: public QObject
{
 Q_OBJECT
 
public:
 
...
 bool caseInsensitiveLessThan(const QString &s1, const QString &s2)
 {
     return s1.toLower() < s2.toLower();
 }
...
 

Этот код не срабатывает:
Код
C++ (Qt)
#include "story.h"
 
void Story::importFromClipboard(const QStringList &list)
{  
 qStableSort(list.begin(), list.end(), caseInsensitiveLessThan);
}

Что не правильно делаю и как все таки верно оформить?


Название: Re: qStableSort - расположение своего функтора
Отправлено: alex312 от Май 06, 2015, 10:55
что делать:
1) забыть про qStableSort и пользоватся std::stable_sort ;
2) понять что указатель на функцию не эквивалентен указателю на метод.
В связи с пунктом 2 или оставить функцию сравнения самосоятельной функцией,либо ознакомиться с std::bind и лямбдами.


Название: Re: qStableSort - расположение своего функтора
Отправлено: Serega от Май 06, 2015, 11:20
Спасибо! Основное уловил.


Название: Re: qStableSort - расположение своего функтора
Отправлено: Fregloin от Май 06, 2015, 16:42
static модификатор в h-нике добавьте своей функции и будет вам счастье )


Название: Re: qStableSort - расположение своего функтора
Отправлено: Serega от Май 07, 2015, 05:53
Спасибо! Теперь все в полном порядке. И надеюсь окончательно осознал.


Название: Re: qStableSort - расположение своего функтора
Отправлено: Fregloin от Май 07, 2015, 09:17
1) забыть про qStableSort и пользоватся std::stable_sort ;
Объясните почему? И чем лучше qSort (quick sort)? Судя по документации время сортировки у них одинаковое, сам не замерял.


Название: Re: qStableSort - расположение своего функтора
Отправлено: Igors от Май 07, 2015, 12:24
Объясните почему? И чем лучше qSort (quick sort)?
Речь о qStableSort, а оно deprecated (и в букваре и в исходниках)

1) забыть ..
2) понять ..
... ознакомиться ..
Почему не "3) простить"  ???

Все-таки как это ужасно когда голова забита глупым std  :'(


Название: Re: qStableSort - расположение своего функтора
Отправлено: m_ax от Май 07, 2015, 13:00
Цитировать
Все-таки как это ужасно когда голова забита глупым std   :'(
Возвёл очи к небу..


Название: Re: qStableSort - расположение своего функтора
Отправлено: Авварон от Май 08, 2015, 09:33
Объясните почему? И чем лучше qSort (quick sort)? Судя по документации время сортировки у них одинаковое, сам не замерял.

Потому что в 2014м году компиляторы НАКОНЕЦ-ТО стали предоставлять более менее вменяемую версию stl и можно не тащить свои велосипеды. Так как сортировка инлайнится и не зависит от ABI stdlib, qSort и qStableSort теперь deprecated за ненадобностью.