解析 Qt 模板库 详细介绍

移动开发
本文介绍了Qt 模板库,很详细的阐述了模板库的用法,现在看内容。

Qt 模板库详细介绍是本文要介绍的内容吧,QT4引入了一组名为郁金香(Tulip)的容器类,用来取代老的 QCollection(QT2.3)基于指针(pointer-based)的 容器类和QTL(QT3)基于值(value-based)的容器类。

  1. Qt3模板库(QTL)       是一套提供对象容器的模板。请看Qt模板库  
  2. QMap                 提供基于值的一个字典的模板类  
  3. QMapConstIterator    QMap的常量迭代器  
  4. QMapIterator         QMap的迭代器  
  5. QPair                提供基于值的一对元素的模板类  
  6. QValueList           提供基于值的一个双向链表的模板类  
  7. QValueListConstIterator    QValueList的常量迭代器  
  8. QValueListIterator    QValueList的迭代器  
  9. QValueStack          提供基于值的一个堆栈模板类  
  10. QValueVector         提供基于值的一个动态数组模板类  

Qt模板库(QTL)是一套提供对象容器的模板。如果你的编译器不能用到一个适当的STL实现,QTL可以替代它。它提供了对象的列表、对象的矢量(Vector 动态数组)、从一种类型到其它的映射(或字典),并且有关联的迭代器(iterator)和算法。一个容器是可以包含和管理其它对象的一个对象并且提供迭代器来允许被包含的对象能够被访问。

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

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

如果你不能复制你所想要存储的对象,你***使用QPtrCollection和它的朋友。它们就是被设计用来正确地处理这些类型的指针语义。这将适用于比如所有继承QObject的类。QObject没有一个复制构造函数,所以把它们作为值来使用是不可能的。你也许可以选择存储QObject的指针到QValueList,但是直接使用QPtrList看起来是对这类应用程序领域的更好的选择。QPtrList,像所有其它的基于QPtrCollection的容器,提供了比一个速度优化了的基于值的容器更多健全的检查。

如果你有一些实现值语义的对象,并且在你的目标平台没有可用的STL,Qt模板库就可以替代它。值语义至少需要以下这些:

一个复制构造函数,

一个赋值操作符和

一个默认构造函数,比如一个没有任何参数的构造函数。

注意一个快速的复制构造函数对于容器的总性能是完全至关重要的,因为许多复制操作将会发生。

如果你打算排序你的数据,那么你必须在你的数据类中实现operator<()。

基于值的类的候选对象有QRect、QPoint、QSize、QString和所有简单的C++类型,比如int、bool和double。

Qt模板库是因为速度而被设计。迭代器是非常快的。为了实现这样的性能,所以就比基于QPtrCollection的类做了更少的错误检查。一个QTL容器,比如,没有跟踪任何关联的迭代器。这样就在比如删除项目的时候没有自动地执行有效性检查,但无论如何,它提供了很快很好的性能。

  1. operator<()

自然地,这些排序模板在常量迭代器下不能工作。

  1. QString second( "Einstein" );  
  2. QString name( "Albert" );  
  3. qSwap( second, name );  
  4. QValueList<int> l;  
  5. l.push_back( 1 );   
  6. l.push_back( 1 );   
  7. l.push_back( 1 );   
  8. l.push_back( 2 );   
  9. int c = 0;  
  10. qCount( l.begin(), l.end(), 1, c ); // c == 3  
  11. QValueList<int> l;  
  12. l.push_back( 1 );   
  13. l.push_back( 1 );   
  14. l.push_back( 1 );   
  15. l.push_back( 2 );   
  16. QValueListIterator<int> it = qFind( l.begin(), l.end(), 2 );  
  17. QValueVector<int> v(3);  
  18. qFill( v.begin(), v.end(), 99 ); // v包含99, 99, 99  
  19. QValueVector<int> v1(3);  
  20. v1[0] = 1;  
  21. v1[2] = 2;  
  22. v1[3] = 3;  
  23. QValueVector<int> v2(5);  
  24. v1[0] = 1;  
  25. v1[2] = 2;  
  26. v1[3] = 3;  
  27. v1[4] = 4;  
  28. v1[5] = 5;  
  29. bool b = qEqual( v1.begin(), v2.end(), v2.begin() );  
  30. // b == TRUE  
  31. QValueList<int> l;  
  32. l.push_back( 100 );  
  33. l.push_back( 200 );  
  34. l.push_back( 300 );  
  35. QTextOStream str( stdout );  
  36. qCopy( l.begin(), l.end(), QTextOStreamIterator(str) );  
  37. QValueVector<int> vec(3);  
  38. vec.push_back( 100 );  
  39. vec.push_back( 200 );  
  40. vec.push_back( 300 );  
  41. QValueVector<int> another;  
  42. qCopyBackward( vec.begin(), vec.end(), another.begin() );  
  43. // “another”现在包含100、200、300  
  44. // 无论如何元素都被一次性复制  
  45. // 是按倒序排列的(300、200、100) 

另外,你可以把任何一个Qt模板库的迭代器作为OutputIterator使用。只需要注意迭代器的右面现在存在的元素和你所想要插入的一样多。下面这个例子就说明了这些:

  1. QStringList l1, l2;  
  2. l1 << "Weis" << "Ettrich" << "Arnt" << "Sue";  
  3. l2 << "Torben" << "Matthias";  
  4. qCopy( l2.begin(), l2.end(), l1.begin() );  
  5. QValueVector<QString> v( l1.size(), "Dave" );  
  6. qCopy( l2.begin(), l2.end(), v.begin() ); 

这段代码结束后,列表l1包含“Torben”、“Matthias”、“Arnt”和“Sue”,前面的内容被覆盖了。矢量v包含“Torben”、“Matthias”、“Dave”和“Dave”,也是前面的内容被覆盖了。

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

  1. int arr[] = { 100, 200, 300 };  
  2. QTextOStream str( stdout );  
  3. qCopy( arr, arr + 3, QTextOStreamIterator( str ) );流   
  4. QDataStream str(...);  
  5. QValueList<QRect> l;  
  6. // ……在这里填充这个列表  
  7. str << l

容易可以这样被再一次地读入:

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

这些也同样适用于QStringList、QValueStack和QMap。

小结:Qt 模板库详细介绍的内容就介绍到这里,希望本文对你有帮助!

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

2011-06-23 09:00:04

QT QODBC 数据库

2011-06-21 14:01:07

QT 界面库 Embedded

2011-06-22 17:09:50

QT 进程 通信

2011-08-29 10:22:48

QtWebkit 模块HTML文档

2011-07-07 14:14:41

PHP模版

2011-07-07 16:15:20

Smarty

2011-06-29 14:56:28

Qt Creator 快捷捷

2011-06-22 09:40:32

QT 模板库 模板

2023-12-05 16:01:12

模板方法设计模式算法结构

2011-06-22 14:30:44

QT 多线程 线程

2023-11-16 09:01:37

Hadoop数据库

2011-06-09 11:11:35

QT 静态库 动态库

2011-06-27 09:36:58

Ubuntu Qt Creator

2011-06-24 11:25:30

Qt Qt 4.6.2 VS 2005

2011-07-07 08:49:14

iPhone Push Notificati

2011-03-21 13:21:23

数据库开发规范

2009-12-04 15:28:36

PHP JSON类库

2011-09-06 16:00:08

QT平台静态库

2011-06-21 18:02:14

Qt 动态 链接库

2011-06-30 14:04:41

Qt IP地址 接口
点赞
收藏

51CTO技术栈公众号