Search code examples
c++qtqsortqlist

Qt 4.8: trying to sort QList<QStringList> on 1st element of QStringList as integer


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.


Solution

  • 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();
    }