表5 基于指针的集合类表
QMemArray 是一个例外,它既不是基于指针也不是基于值,而是基于内存的结构。用于在有简单数据结构的数组中使用
QMemArray效率最高,QMemArray在拷贝和数组元素比较时使用位逻辑运算符操作。
这些类中有一些具有迭代器,迭代器是遍历集合类中的条目的类。在Qt模板库里,基于值的集合和算法集成在一起。下面讨
论基于指针的容器。
1、基于指针的容器的结构
基于指针的容器有4个内部基类(QGCache, QGDict, QGList和QGVector)操作void类型指针。通过增加/删除条目指针,一个由
这4个类组成的薄模板层实现了实际的集合。
允许Qt的模板类的策略使得在空间上很经济(实现这些模板类仅增加了对基类的内联调用),而且还不影响执行效率。
示例:QPtrList使用
下面的例子说明了如何存储Employee条目到一个链表,并将它们以相反的次序打印出来。
#include <qptrlist.h>
#include <qstring.h>
#include <stdio.h>
class Employee{public: Employee( const char *name, int salary ) {
n=name; s=salary;
}
const char *name() const {
return n;
}
int salary() const {
return s;
}
private: QString n;
int s;
};
int main(){
QPtrList<Employee> list; // 指向Employee的指针链表
list.setAutoDelete( TRUE ); //当链表条目被移动时,删除条目
list.append( new Employee("Bill", 50000) ); //链表追加新的对象
list.append( new Employee("Steve",80000) );
list.append( new Employee("Ron", 60000) );
QPtrListIterator<Employee> it(list); //遍历Employee链表
for ( it.toLast(); it.current(); --it) ) { //从尾向头遍历
Employee *emp = it.current();
printf( "%s earns %d\n", emp->name(), emp->salary() );
}
return 0;
}
程序运行结果如下:
Ron earns 60000
Steve earns 80000
Bill earns 50000
2、管理集合条目
所有基于指针的集合继承了QPtrCollection基类。这个类仅知道集合中的条目个数和删除策略。
当集合中的条目被移去时,缺省时它们不被删除。QPtrCollection::setAutoDelete()定义了删除策略。在上述QPtrList使用示例
子,我们激活了自动删除功能来进行链表删除。