QT核心编程之Qt模板库(1)

移动开发
Qt Extended 选择了几个可用的软件,提供给Qt 优化软件开发,与嵌入式linux 设备,每一个模块都是使用一些库,插件,应用程序预计服务器的组件, 可以被其他的模块来使用。

本文介绍的是QT核心编程之Qt模板库QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容。

Qt模板库QT Template Library 简称QTL)是一套提供对象容器的模板。如果你的编译器没有适当的STL(标准模板库)可用,QTL将被代替使用。QTL提供了对象的链表、对象的矢量(动态数组)、从一个类型到另一个类型的映射(或称为字典)和相关的迭代器和算法。一个容器是包含和管理其它对象的一个对象,并且提供迭代器对被包含的对象进行访问。 Qt模板类说明如表2。

QT核心编程之Qt模板库

表2 Qt模板类说明

QTL类的命名约定与其他Qt类一致(比如,count()、isEmpty())。它们还提供额外的函数来兼容STL算法,比如size()和empty()。可以像使用STL的函数map一样来使用它们。

与STL相比,QTL仅仅包含了STL容器应用程序接口的最重要的特性,没有平台差异,通常要慢一些并且经常扩展为更少的对象代码。

如果你不想拷贝存储对象,你最好使用QPtrCollection及派生类。它们就是被设计用来处理各种类指针的。QObject没有拷贝构造函数,因此QObject不能作为一个值使用。但可以存储指向QObject的指针到QValueList。当然,直接使用QPtrList更好。 QPtrList像所有其它的基于QPtrCollection的容器一样,提供了比速度优化了、基于值的容器更多健全的检查。

如果你有一些使用值的对象,并且在你的目标平台没有可用的STL,Qt模板库就可以替代它。使用值的对象至少需要一个拷贝构造函数、一个赋值操作符和一个默认构造函数(如:一个没有任何参数的构造函数)。

注意一个快速的拷贝构造函数对于容器的高性能是关键的,因为许多拷贝操作将会发生。如果你想排序你的数据,你必须在你的数据类中实现operator<()。

Qt模板库是为高性能而设计,迭代器是非常快的。为了实现这样的性能,Qt模板库比基于QPtrCollection的集合类做更少的错误检查。一个QTL容器,例如:QTL容器没有跟踪任何相关的迭代器。这样在诸如删除条目时没有执行有效性检查,但它提供了很好的执行性能。

1、迭代器(Iterators)

Qt模板库打交道的是值对象,而不是指针对象。迭代器是最好的遍历容器方法。遍历一个容器可使用像下面的循环:

typedef QValueList<int> List;List l;for( List::Iterator it = l.begin(); it != l.end(); ++it )     printf( "Number is %i\n", *it );
begin()返回第一个元素的迭代器,end()返回的是最后一个元素之后的一个迭代器。end()标明的是一个无效的位置,它永远不能被解除引用。它只是任何一次迭代的终止条件,迭代可以从begin()或end()开始。同样的概念也适用于其它容器类,例如,用于QMap和QValueVector 的迭代方法如下:

typedef QMap<QString,QString> Map;Map map;for( Map::iterator it = map.begin(); it != map.end(); ++it )    printf( "Key=%s Data=%s\n", it.key().ascii(), it.data().ascii() ); typedef QValueVector<int> Vector;Vector vec;for( Vector::iterator it = vec.begin(); it != vec.end(); ++it )    printf( "Data=%d\n", *it );

2、算法

Qt模板库定义了大量操作容器的算法。这些算法用模板库函数实现,还提供了有迭代器的容器的通用代码。例如:qHeapSort()和qBubbleSort()提供了著名的堆排序和冒泡排序算法。你可以象下面这样使用它们:

  1. typedef QValueList<int> List;List l;  
  2. << 42 << 100 << 1234 << 12 << 8;qHeapSort( l );  
  3.  List l2;  
  4. l2 << 42 << 100 << 1234 << 12 << 8;  
  5. List::Iterator b = l2.find( 100 );  
  6. List::Iterator e = l2.find( 8 );  
  7. qHeapSort( b, e );  
  8.  double arr[] = { 3.2, 5.6, 8.9 };  
  9. qHeapSort( arr, arr + 3 ); 

第一个例子对整个列表排序。第二个例子对两个迭代器之间的所有元素排序,即100、1234和12。第三个例子表明迭代器是作为指针使用的。

一些常用的模板函数说明如下:

(1)函数qSwap()用来交换两个变量的值,例如:

  1. QString second( "Einstein" );  
  2.     QString name( "Albert" );  
  3. qSwap( second, name ); 

(2)函数qCount()用于统计容器中一个值出现的次数。例如:

  1. QValueList<int> l;  
  2.     l.push_back( 1 );        //放入1到l链表中  
  3.       l.push_back( 1 );  
  4.               l.push_back( 1 );  
  5.               l.push_back( 2 );  
  6.               int c = 0;qCount( l.begin(), l.end(), 1, c );  
  7.  //统计1的个数c, c = 3 

(3)函数qFind()用于查找容器中一个值的第一次出现位置。例如:

  1. QValueList<int> l;  
  2.     l.push_back( 1 );   
  3.              l.push_back( 1 );  
  4.               l.push_back( 1 );  
  5.               l.push_back( 2 );            //查找2所在的位置  
  6.     QValueListIterator<int> it = qFind( l.begin(), l.end(), 2 ); 

(4)函数qFill()用于将一个值拷贝填充到一个范围。例如:

QValueVector<int> v(3);qFill( v.begin(), v.end(), 99 ); //将99填充整个v数组, v包含99, 99, 99

(5)函数qEqual()用来比较两个范围的元素是否相等,两个范围的元素个数不一定相等。只要第一个范围的元素与第二个范围的对应元素都相等时,就认为这两个范围相等。例如:

  1. QValueVector<int> v1(3);  
  2.    v1[0] = 1;  
  3.     v1[2] = 2;  
  4.     v1[3] = 3;   
  5.     QValueVector<int> v2(5);  
  6.     v1[0] = 1;   
  7.    v1[2] = 2;  
  8.     v1[3] = 3;   
  9.    v1[4] = 4;    v1[5] = 5;  
  10.      bool b = qEqual( v1.begin(), v2.end(), v2.begin() );  
  11.     // b == TRUE 

(6)函数qCopy()用于拷贝一个范围的元素到输出迭代器,例如:

  1. QValueList<int> l;  
  2.     l.push_back( 100 );   
  3.    l.push_back( 200 );   
  4.    l.push_back( 300 );  
  5.     QTextOStream str( stdout );  //拷贝l中所有元素到输出迭代器QTextOStreamIterator   
  6.    qCopy( l.begin(), l.end(), QTextOStreamIterator(str) ); 

(7)函数qCopyBackward()用于拷贝一个容器或者它的一部分到一个输出迭代器,拷贝的次序是从后面开始,例如:

  1. QValueVector<int> vec(3);  
  2.     vec.push_back( 100 );  
  3.     vec.push_back( 200 );  
  4.     vec.push_back( 300 );   
  5.    QValueVector<int> another;  // “another”包含的是按倒序排列的(300、200、100)  
  6.     qCopyBackward( vec.begin(), vec.end(), another.begin() ); 

如果你写了新的算法,请考虑把它们写成模板函数,这样就可以使它们能够用在尽可能多的容器上了。在上一个例子中,你可以很容易地使用qCopy()打印出一个标准C++数组,方法列出如下:

  1. int arr[] = { 100, 200, 300 };  
  2.    QTextOStream str( stdout );  
  3.     qCopy( arr, arr + 3, QTextOStreamIterator( str ) ); 

3、数据流串行化

所有提到的容器(如:QValueList 、QStringList、QValueStack和QMap等)都可被相应的流操作符串行化。下面是一个例子。

  1. QDataStream str(...);   
  2.    QValueList<QRect> l;    // ……在这里填充这个列表  
  3.     str << l

容器还能象下面这样被再一次读入:

  1. QValueList<QRect> l;    str >> l; 

小结:QT核心编程之Qt模板库的内容介绍完了,希望本篇能够帮助你有效学习,更多内容,在编辑推荐进行参考。

【编辑推荐】

QT核心编程之集合类 (2)

QT核心编程之Qt线程 (3)

QT核心编程之鼠标拖放 (4)

QT核心编程之键盘焦点 (5)

QT核心编程之会话管理 (6)

QT核心编程之调试技术 (7)

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-22 10:12:08

Qt 线程

2011-06-22 09:58:04

QT 集合类

2011-06-22 10:39:56

QT 会话管理

2011-06-22 10:27:32

QT 键盘 焦点

2011-06-22 10:20:11

QT 鼠标 拖放

2011-06-22 10:45:21

QT 调试

2011-06-29 15:02:25

Qt 模板库

2011-06-21 15:31:04

Qt 数据库 SQL

2011-06-17 14:12:32

Qt

2011-08-30 14:59:34

Qt数据库

2011-08-30 14:15:34

QTSQLite数据库

2011-07-05 14:46:34

2011-06-23 09:00:04

QT QODBC 数据库

2011-06-24 15:30:22

QT 皮肤 QSS

2011-06-13 16:51:19

Qt Socket

2011-06-10 12:44:09

2011-06-21 13:52:18

Qt 界面

2011-06-08 14:39:06

Qt 教程

2011-08-30 13:49:57

Qt数据库QTableView

2011-08-30 13:33:29

Qt数据库
点赞
收藏

51CTO技术栈公众号