Reputation: 2658
I have a QList<QStringList>
named sortme
of which the first QString
in each QStringList
is a valid integer as a string, for example:
exampleQStringList << "5" << "foo" << "bar"
For qsort, which is what 4.8 uses rather than std:, I understand I want a comparison function. Here's what I thought I needed to write:
bool MainWindow::qslLessThan(const QList<QStringList> &v1, const QList<QStringList> &v2)
{
// here I would get the first element.toInt() and return <
return(true);
}
and then:
qSort(sortme.begin(), sortme.end(), qslLessThan);
I am missing something, clearly, as the compiler complains "error: no matching function for call to 'qSort(QList::iterator, QList::iterator, )'" even though I am trying to sort a QList<QStringList>
and sortme
is that.
Upvotes: 0
Views: 2283
Reputation: 1008
Firstly the function that the qsort() requires must be a raw function and not a member of any class. Secondly this comparison function must take, in your case, QStringList references rather than QList references as it is the QStringLists you are comparing.
#include <QCoreApplication>
#include <QDebug>
bool lessThan( const QStringList& v1, const QStringList& v2 )
{
return v1.first() < v2.first();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<QStringList> sortme;
QStringList entryOne = QStringList() << "1" << "foo1" << "bar1";
QStringList entryTwo = QStringList() << "2" << "foo2" << "bar2";
QStringList entryThree = QStringList() << "3" << "foo3" << "bar3";
sortme << entryTwo << entryOne << entryThree;
qSort( sortme.begin(), sortme.end(), lessThan );
// Print out the list data so we can see that it got sorted ok
for( int i = 0; i < sortme.size(); i++ )
{
QString data = sortme.at( i ).join( "," );
qDebug() << QString( "Item %1: %2" ).arg( i + 1 ).arg( data );
}
return a.exec();
}
Upvotes: 3