C++ 容器类与Qt容器类对比 (1)概述
C++中容器类是属于标准模板库中的内容,有必要回顾下标准模板库。STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是
C++中容器类是属于标准模板库中的内容,有必要回顾下标准模板库。STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。
STL被内建在编译系统之内。
在C++标准中,STL被组织为下面的13个头文件:
<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效。
三个基本的STL组件:
1) 迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
2) 容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
3) 算法是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
/*------------------------------------------------------------------------------------------------------*/
Qt容器类
像MFC一样,Qt provides its own container classes, so for Qt programs we can use both the Qt and the STL containers. The main advantages of the Qt containers are that they behave the same on all platforms and that they are implicitly shared (就是说也可以在Qt中使用STL,但是出了问题不关Qt的事情。).
Qt容器类的好处在于,它提供了平台无关的行为,以及隐式数据共享技术。所谓平台无关,即Qt容器类不因编译器的不同而具有不同的实现;所谓“隐式数据共享”,也可以称作“写时复制copy on write”,这种技术允许在容器类中使用传值参数,而不会发生额外的性能损失。
Qt支持两种风格的迭代器——Java-style和STL-style,Java-style的迭代器更容易使用,而STL-style的迭代器可以同Qt和STL中的算法联合使用,更为强大。
Qt provides the following sequential containers: QList, QLinkedList, QVector, QStack, and QQueue. associative containers: QMap, QMultiMap, QHash, QMultiHash, and QSet.
参考资料:
http://baike.baidu.com/view/332356.htm
using stl--译者:kary
Qt容器类 总结 http://zhaojiang1.blog.163.com/blog/static/464215382010113042238225/
C++ GUI Programming with Qt4
C++_Primer
更多推荐
所有评论(0)