[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