[Interest] Best practice for sorting multiple (connected) QLists

Constantin Makshin cmakshin at gmail.com
Wed Nov 20 04:41:41 CET 2013


Another advantages of this approach are more efficient memory utilisation
(less storage and [re]allocation overhead) somewhat better cache locality
because all fields related to a particular person will be close to each
other in memory instead of being spread all over the place ("somewhat
better" because QString-s and similar classes will need indirections to
access their contents anyway).

I personally would recommend not to use separate lists for closely-related
data unless that's *really* neccessary.
On Nov 20, 2013 12:41 AM, <andre at familiesomers.nl> wrote:

> Joshua Grauman schreef op 19.11.2013 21:26:
> > I fairly often find myself wanting to sort a bit of data. Imagine I
> > have a
> > few QList<int>'s a QStringList's and that they correspond like a
> > database
> > table so that I always append to all the lists together with data for
> > one
> > row. Something like:
> >
> > QList<int> age, height;
> > QStringList firstname, lastname;
> > while(data)
> > {
> >     age.append(getData1());
> >     height.append(getData2());
> >     firstname.append(getData3());
> >     lastname.append(getData4());
> > }
> >
> > Now what if I want to sort all that data, (say by age) so that I can
> > print
> > out all the first and last names in order according to age.
>
> I think your problem is in your data structure. Instead of using
> separate containers for each of the fields, you should use a single
> container with all of the fields:
>
> struct Person
> {
>      int age;
>      int height;
>      QString firstName;
>      QString lastName;
> }
>
> QList<Person> persons;
> while(data)
> {
>      Person person;
>      person.age = getData1();
>      person.height = getData2();
>      person.firstName = getData3();
>      person.lastName = getData4();
>      persons.append(person);
> }
>
> Now, you can easily sort the persons list itself by using qSort with a
> comparison function for the field you want to sort on, or keep track of
> the order by using a QMap<key, int> using the index into the persons
> list as the value of your map.
>
> Alternatively, look into Boost.MultiIndex.
>
> André
>
> >
> > I've tried different ways of doing this, but they all seem a bit
> > contrived. The best I've come up with is to have another QMap<int, int>
> > that maps the sorting order to the indices like:
> >
> > QList<int> age, height;
> > QStringList firstname, lastname;
> > QMap<int, int> order;
> > while(data)
> > {
> >     age.append(getData1());
> >     height.append(getData2());
> >     firstname.append(getData3());
> >     lastname.append(getData4());
> >     order[age.last()] = age.size()-1;
> > }
> >
> > QList<int> orderedIndices = order.values();
> >
> > for(int i=0; i<orderedIndices.size(); i++)
> > {
> >    print(firstname[orderedIndices[i]], lastname[orderedIndices[i]]);
> > }
> >
> > It's not too bad. I'm not worried about performance, most of the time
> > these are just small amounts of data that don't warrant creating a new
> > class to handle, or creating a database for. I'm just wondering if
> > anyone
> > has a cleaner way of handling this? What do you do for these types of
> > situations?
> >
> > Josh
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20131120/7f1ba1f5/attachment.html>


More information about the Interest mailing list