Qt的容器类之通用算法

我们经常对不同类型的容器做类似的操作。由此而生了通用算法。Qt实现了其中最常用的13个。
下面对列举这些通用算法:
(1)排序
       qSort使用快速排序算法,将一个元素序列排成升序。
       qStableSort也能完成类似的排序操作,但是能够确保值相等的元素在排序的前后相对顺序不变。
(2)搜索
        对于有序容器,通用算法qBinaryFind使用二分搜索算法,在容器中快速搜索一个等于某个指定值的元素,返回一个指向该元素的迭代器。如果容器中有多个元素等于指定值,其中任何一个可能被返回。
        qLowerBound和qUpperBound却具有更加确定的搜索结果。qLowerBound在一个元素序列中寻找第一个等于(或者大于)指定值的元素,返回一个指向该元素的迭代器。而qUpperBound在一个元素序列中寻找最后一个大于指定值的元素,返回指向该元素的一个迭代器。
        无论容器是否有序,qFind在容器中逐个搜索与某个指定值相等的元素,并返回一个指向该元素的迭代器。
(3)修改容器的元素
        qFill将一个元素序列中的每个元素设置为一个相同的值。
        qCopy按照从前向后的顺序将一个元素序列复制到所在容器的其他位置或者另外一个容器中。
        qCopyBackward按照从后向前的顺序完成类似的操作。
(4)其他
         qCount计算某个值在容器中出现的次数。
         qDeleteAll调用C++运算符delete,析构容器中的元素。
         qEqual比较两个元素序列是否相等。
         qSwap调换两个元素的值。
特别说明:
   普通数组可以被看作容器,而普通指针可以被看作迭代器。当我们使用普通C++指针来访问一个普通数组时,其格式等同于通过迭代器来访问一个容器。因此可以使用QT中的通用算法来处理普通数组。   
例如,下面的代码将数组的元素全部赋为一个相同的值:
int a[] = {2,0,1,6,1,2,1,3};
qFill(a, a+5, 10 );


关于函子
        我们将这些能够像函数一样被“调用”的语法元素统称为函子(function object或functor)。 C语言中的函数、函数指针、具有函数调用格式的宏是函子。在C++语言中,如果一个类或者类模板重载了函数调用运算符,它们的对象也可以像函数那样被“调用”,因而这些对象(而不是类或类模板)也是函子。
        和普通函数相比,选择类或者类模板的对象作为函子具有以下优势:
      (1)类或者类模板具有数据成员,可被用来存放函子所要操作的数据,或者用来记录函子的执行状态。
      (2)类模板可以处理不同类型的数据,这是普通函数所不具备的。
      (3)类或者类模板可以使用代码内联(inline )技术,减少函数调用开销,执行的速度要比普通函数快。
      Qt中定义了两个函子qLess和qGreater。给定两个元素,这两个函子返回的bool值恰好相反。仅用于调用qSort或者qStableSort时,传递一个qLess对象,将以升序排列一个元素序列。传递一个qGreater对象,将以降序排列。
这两个函子在其内部使用运算符“<”比较两个元素,这实际上要求容器元素的类型满足以下条件:
给定两个元素,第一,能够使用运算符“<”比较这两个元素,第二,比较所得结果和逻辑上的结果一致。
C++基本类型都满足这一条件,但是用户自定义的类型却不一定。因此需要重新定义一个函子,通过重载函数operator()来实现得到结果与逻辑结果一致的要求。
例如: 
struct IndirectCompare{
    IndirectCompare(const QVector &  v):  v(v1)    {}
    bool operator() (int x, int y) const{
            return v[x] < v[y];
   }   
   bool operator() (int x, const QString & a) const {
            return v[x] < a;
   }
   bool operator() (const QString & a, int x) const{
            return a < v[x];
   }   
const QVector & v;
}


int main()
{     ......
    for(size_t  i =;i        index[i] =i;
    IndirectCompare aComparison(words);
    qSort(index.begin(), index.end(), aComparison);
      .......
}

你可能感兴趣的:(Qt,Qt读书笔记)