Qt排序问题

来源:互联网 发布:matlab 2017b for mac 编辑:程序博客网 时间:2024/06/05 03:03

很久没有写点东西了,最近忙着赶一个Qt项目,用到了很多Qt的基础知识,什么是Qt就不做介绍了,可以去网上搜一下,有很多讲Qt的文章。在用它的过程中我发现网上很少能找到比较深入的知识点讲解,可能是用它做开发的人比较少吧。

今天我要描述的不是排序算法问题,因为排序算法很多,比如插入排序(直接插入排序、希尔排序)、交换排序(冒泡排序、快速排序)、选择排序(直接选择排序、堆排序)、基数排序和归并排序,网上有很多讲解,这里就不做叙述。今天要讲的是Qt对模板中的元素进行排序。通过查MSDN可以知道,C++SDK中的模板类基本上都有自带的排序函数,可以直接使用,但是Qt的模板类没有自带这样的函数,而是通过一个函数名是qSort的对模板的元素进行排序。

有一定的C++开发经验的都应该知道,如果要对模板中的元素进行排序,前提是元素类型必须可以比较,标准的来说要实现对运算符"<"的重载。这样,模板在对元素进行排序的时候就可以对元素进行比较,然后进行排序。下面是一个运算符重载的一个小例子。

class TestMatchData{public:int m_index;//通过比较这个变量实现类实例的比较QString m_str;TestMatchData(int index,QString str)//构造函数{m_index = index;m_str = str;}TestMatchData(){}friend bool operator < (const TestMatchData &data1,const TestMatchData &data2)//实现运算符"<"的重载{if(data1.m_index < data2.m_index)return true;return false;}};
实现了对模板元素类中比较运算符"<"的重载之后就可以对进行模板元素排序了。

QVector<TestMatchData> maps = QVector<TestMatchData>();/****向QVector中添加TestMatchData的实例*/qSort(maps.begin(), maps.end());//实现了对QVector中元素的排序

在用这个方法之前,我用的是QMap,通过键值对实现排序,但是最后发现个问题,就是如果后续插入的元素的键值与前面已经插入的有重复会将前面插入的元素覆盖,所以赶紧找另外的方法,也就是这个方法。

查Qt的帮助文档可以看到,qSort这个函数的排序方法的快速排序,所以效率很高,不用担心。

void qSort ( RandomAccessIterator begin, RandomAccessIterator end )Sorts the items in range [begin, end) in ascending order using the quicksort algorithm.
当然qSort这个函数不只是可以对QVector的元素进行排序,对QList等多个模板类也可以进行排序。