主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数 |
QPtrList类是一个提供双向链表的模板类。 详情请见……
#include <qptrlist.h>
继承了QPtrCollection。
被QObjectList、QSortedList和QStrList继承。
QValueList是可以替代这个类的的一个可兼容STL的的选择。
定义一个模板实例QPtrList<X>就创建了一个操作X(X*)指针的列表。
这个列表类是可以索引的并且有一个当前索引和一个当前项。第一项对应的是索引0。如果当前项为空,则当前索引为-1。
使用prepend()、insert()或append()可以插入项。可以使用remove()、removeRef()、removeFirst()和removeLast()来移除项。你可以使用find()、findNext()、findRef()或findNextRef()来搜索一个项。列表可以使用sort()来排序。你可以使用contains()或containsRef()来得到一个项出现的次数。你也可以使用current()来得到指向当前项的指针,用at()来得到一个在特定索引位置的项的指针,用getFirst()和getLast()来得到第一个或最后一个项的指针。你也可以使用first()、last()、next()和prev()(它们都会更新current())来遍历列表。列表的删除属性可以用setAutoDelete()来设置。
实例:
class Employee { public: Employee() : sn( 0 ) { } Employee( const QString& forename, const QString& surname, int salary ) : fn( forename ), sn( surname ), sal( salary ) { } void setSalary( int salary ) { sal = salary; } QString forename() const { return fn; } QString surname() const { return sn; } int salary() const { return sal; } private: QString fn; QString sn; int sal; }; QPtrList<Employee> list; list.setAutoDelete( TRUE ); // list列表拥有了这个对象 list.append( new Employee("John", "Doe", 50000) ); list.append( new Employee("Jane", "Williams", 80000) ); list.append( new Employee("Tom", "Jones", 60000) ); Employee *employee; for ( employee = list.first(); employee; employee = list.next() ) cout << employee->surname().latin1() << ", " << employee->forename().latin1() << " earns " << employee->salary() << endl; cout << endl; // 对于非常大的列表是很没有效率的 for ( uint i = 0; i < list.count(); ++i ) if ( list.at(i) ) cout << list.at( i )->surname().latin1() << endl;
输出是
Doe, John earns 50000 Williams, Jane earns 80000 Jones, Tom earns 60000 Doe Williams Jones
QPtrList有几个函数可以遍历列表,但是使用QPtrListIterator会更实用。多重列表的迭代器也可以遍历同一个列表,它们之间以及和当前列表项无关。
在上面的例子中,我们调用setAutoDelete(TRUE)使自动删除生效就是说列表在移除项的时候一起删除它。默认选项是当它们被移除的时候不被删除,但是我们的例子中对没有列表项没有其它的引用,所以如果不这么做的话会导致内存泄漏。
列表项被作为void*存储在内部的QLNode终了,它也保存指向前一个和后一个列表项的指针。currentNode()、removeNode()和takeNode()函数可以直接操作QLNode,但是必须仔细使用它们。节点的数据部分可以使用QLNode::getData()得到。
当向列表插入一个项的时候,只有指针被复制,而不是项自身,比如,我们做了一个浅复制。当一个项被插入时,也是可以让列表复制这个项的所有数据(深复制)。insert()、inSort()和append()在项被插入时调用虚函数QPtrCollection::newItem()。如果你想深复制,请继承这个列表并重新实现它。
当从列表中移除一个项时,虚函数QPtrCollection::deleteItem()被调用。QPtrList的默认实现是如果自动删除生效,就删除这个项。
虚函数compareItems()可以被重新实现用来比较两个列表项。这个函数被所有需要比较列表项的列表函数调用,比如remove(const type*)。如果你只想处理指针,又可以替代比较指针的函数,比如removeRef(const type*)。这些函数比那些调用compareItems()的稍微快些。
qstrlist.h中定义的QStrList是一个char*的列表。它重新实现了newItem()、deleteItem()和compareItems()。
也可以参考QPtrListIterator、集合类和非GUI类。
list的每一个项都被添加到这个列表中。只有指针被复制(浅复制)。
访问这个列表的所有列表迭代器都会被重置。
也可以参考setAutoDelete()。
被插入的项变为当前列表项。这和insert( count(), item )是相同的。
item必须不是一个空指针。
也可以参考insert()、current()和prepend()。
实例:customlayout/border.cpp、customlayout/card.cpp、customlayout/flow.cpp、grapher/grapher.cpp、listviews/listviews.cpp、listviews/listviews.h和qwerty/qwerty.cpp。
如果index有效,设置这个项为当前列表项。有效范围是0……(count() - 1)。
这个函数是非常有效的。它从第一项、最后一项或当前项中最接近index的开始扫描。
也可以参考current()。
实例:customlayout/border.cpp、customlayout/card.cpp、customlayout/flow.cpp、dirview/dirview.cpp、fileiconview/qfileiconview.cpp、mdi/application.cpp和qwerty/qwerty.cpp。
返回当前列表项的索引。如果当前项为空,返回值为-1。
也可以参考current()。
返回自动删除选项的设置。默认为假。
也可以参考setAutoDelete()。
如果自动删除生效,被移除的项目将被删除。
所有访问这个列表的列表迭代器都将被重置。
也可以参考remove()、take()和setAutoDelete()。
从QPtrCollection中重新实现。
这个虚函数比较两个列表项。
返回:
这个函数返回int而不是bool,这样可以重新实现返回三个值并且使用它来排序:
inSort()需要compareItems()像这里所描述的这样来被实现。
这个函数不应该修改列表,因为一些常量函数调用compareItems()。
默认实现是比较指针。
当在列表中搜索item时,compareItems()函数被调用。如果compareItems()没有被重新实现,调用containsRef()是更有效率的。
这个函数不影响当前列表项。
也可以参考containsRef()和compareItems()。
调用这个函数比contains()快多了,因为contains()使用compareItems()来用item与列表中的每一个项进行比较。这个函数只比较指针。
这个函数不影响当前列表项。
也可以参考contains()。
也可以参考isEmpty()。
实例:customlayout/border.cpp、customlayout/card.cpp、customlayout/flow.cpp、fileiconview/qfileiconview.cpp、grapher/grapher.cpp、mdi/application.cpp和qwerty/qwerty.cpp。
从QPtrCollection中重新实现的。
也可以参考at()。
节点可以被保存并且稍后使用removeNode()移除。这样做的优点是可以直接移除这个项,而不用搜索列表。
警告:不要调用这个函数,除非你是专家。
也可以参考removeNode()、takeNode()和current()。
如果这个项被找到,列表会设置当前项指向找到的项,并且返回这个项的索引。如果没有被找到,列表设置当前项为空,当前索引为-1,并且返回-1。
当在列表中搜索这个项时,compareItems()函数被调用。如果compareItems()没有被重新实现,调用findRef()是更有效率的。
也可以参考findNext()、findRef()、compareItems()和current()。
如果这个项被找到,列表会设置当前项指向找到的项,并且返回这个项的索引。如果没有被找到,列表设置当前项为空,当前索引为-1,并且返回-1。
当在列表中搜索这个项时,compareItems()函数被调用。如果compareItems()没有被重新实现,调用findNextRef()是更有效率的。
也可以参考find()、findNextRef()、compareItems()和current()。
如果这个项被找到,列表会设置当前项指向找到的项,并且返回这个项的索引。如果没有被找到,列表设置当前项为空,当前索引为-1,并且返回-1。
调用这个函数比findNext()快得多,因为findNext()是使用compareItems()来用item与列表中的每一个项进行比较。这个函数只比较指针。
也可以参考findRef()、findNext()和current()。
如果这个项被找到,列表会设置当前项指向找到的项,并且返回这个项的索引。如果没有被找到,列表设置当前项为空,当前索引为-1,并且返回-1。
调用这个函数比find()快得多,因为find()是使用compareItems()来用item与列表中的每一个项进行比较。这个函数只比较指针。
也可以参考findNextRef()、find()和current()。
也可以参考getFirst()、last()、next()、prev()和current()。
实例:grapher/grapher.cpp、listviews/listviews.h和showimg/showimg.cpp。
这个函数不影响当前列表项。
这个函数不影响当前列表项。
排序依靠的是虚函数compareItems()。为了维护这个派逊,所有的项都必须使用inSort()来插入。
被插入的项变为当前项。
item必须不能是一个空指针。
请注意inSort()很慢。如果你想先向列表插入很多项,插入完之后再排序,你应该使用sort()。inSort()进行了O(n)次比较。这就意味着插入n个项到你的列表需要比较O(n^2)次,而sort()做同样的工作只需要O(n*log n)次。所以只有在你有一个预先排好序的列表并且想向其中插入少量的项时,再使用inSort()。
也可以参考insert()、compareItems()、current()和sort()。
如果成功返回真,或者如果index超出范围返回假。有效的范围是从0到count()(包括count())。如果index==count(),项就被添加。
被插入的项变为当前项。
item必须不能是一个空指针。
也可以参考count()。
也可以参考getLast()、first()、next()、prev()和current()。
把下一项作为当前项。如果当前项在这次函数调用之前就是最后一项了,当前项将被设置为空。如果当前项为空,这个函数就什么都不做。
也可以参考first()、last()、prev()和current()。
实例:grapher/grapher.cpp、listviews/listviews.h和showimg/showimg.cpp。
这个列表首先被清空,然后list中的每个项都被添加到这个列表中。只有指针被复制(浅复制),除非newItem()被重新实现了。
把这个列表和list进行比较。如果这个列表包含相同的数据,返回真,否则返回假。
在列表开始的位置插入item。
被插入项变为当前列表项。这和insert( 0, item )是相同的。
item必须不能是一个空指针。
也可以参考append()、insert()和current()。
把前一项作为当前项。如果当前项在这次函数调用之前就是第一项了,当前项被设置为空。如果当前项为空,这个函数就什么都不做。
也可以参考first()、last()、next()和current()。
从流s中读取一个列表项并且返回流的引用。
默认实习是设置item为0。
也可以参考write()。
如果成功返回真,或者如果index超出范围返回假。有效范围是0……(count() - 1)(包括count()-1)。
如果自动删除生效,被移除的项目将被删除。
如果被移除的项不是列表中最后一项,被移除的项之后的项变为新的当前列表项。如果最后一项被移除,新的最后一项变为当前项。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考take()、clear()、setAutoDelete()、current()和removeRef()。
移除当前列表项。
如果成功返回真,或者如果当前项为空,返回假。
如果自动删除生效,被移除的项目将被删除。
如果被移除的项不是列表中最后一项,被移除的项之后的项变为新的当前列表项。如果最后一项被移除,新的最后一项变为当前项。如果列表为空,当前项为空。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考take()、clear()、setAutoDelete()、current()和removeRef()。
移除列表中第一次出现的item。
如果成功返回真,或者如果当前项为空,返回假。
如果自动删除生效,被移除的项目将被删除。
当在列表中搜索这个项的时候,compareItems()函数被调用。如果compareItems()没有被重新实现,调用removeRef()是更加有效率的。
如果被移除的项不是列表中最后一项,被移除的项之后的项变为新的当前列表项。如果最后一项被移除,新的最后一项变为当前项。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考removeRef()、take()、clear()、setAutoDelete()、compareItems()和current()。
如果自动删除生效,被移除的项目将被删除。
列表中的第一项变为新的当前列表项。如果列表变空了,当前列表项被设置为空。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考removeLast()、setAutoDelete()、current()和remove()。
如果自动删除生效,被移除的项目将被删除。
列表中的最后一项变为新的当前列表项。如果列表变空了,当前列表项被设置为空。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考removeFirst()、setAutoDelete()和current()。
这个节点必须存在于列表中,否则程序可能会崩溃。
如果自动删除生效,被移除的项目将被删除。
列表中的第一项变为新的当前列表项。如果列表变空了,当前列表项被设置为空。
所有指向被移除的列表迭代器都被指向这项的下一项或者如果被移除的项是最后一项,则指向它的前一项。
警告:不要调用这个函数,除非你是专家。
也可以参考takeNode()、currentNode()、remove()和removeRef()。
如果成功返回真,或者如果这个项在列表中没有被找到,返回假。
如果自动删除生效,被移除的项目将被删除。
列表一直被扫描,直到指针item被找到为止。如果它被发现,它就会被移除。
等价于:
if ( list.findRef( item ) != -1 ) list.remove();
如果被移除的项不是列表中最后一项,被移除的项之后的项变为新的当前列表项。如果最后一项被移除,新的最后一项变为当前项。如果列表变空了,当前列表项被设置为空。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考remove()、clear()、setAutoDelete()和current()。
如果enable为真,设置集合可以自动删除它的内容,并且如果enable为假,就永远不能删除它们。
如果自动删除被打开,当集合本身被删除的时候,集合内所有的项也都被删除。如果只有这个集合指向它的项时,这个方法很方便。
为了安全,默认设置是假。如果你把它打开,对于集合的复制你要注意些——你自己也许会发现两个集合删除同一个项。
注意在子类中自动删除设置也许会影响其它函数。例如,一个有remove()函数的子类将会从它的数据结构中移除这个项,并且如果自动删除生效,也将会删除这个项。
也可以参考autoDelete().
实例:grapher/grapher.cpp、scribble/scribble.cpp和table/bigtable/main.cpp。
使用虚函数compareItems()的结果排序这个列表。
排序中使用堆排序算法。它对n项排序需要O(n*log n)次比较。这是排序问题中接近最佳的解决方案。
如果你的列表中的项支持操作符<和操作符==,你最好离开QSortedList,因为它使用这两个操作符为你实现了compareItems()函数。
也可以参考inSort()。
返回指向你从列表中拿出的项的指针,或者如果索引超出范围,返回空。有效范围是0..(count() - 1)(包括count()-1)。
如果被移除的项不是列表中最后一项,被移除的项之后的项变为新的当前列表项。如果最后一项被移除,新的最后一项变为当前项。如果列表变空了,当前列表项被设置为空。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考remove()、clear()和current()。
实例:customlayout/border.cpp、customlayout/card.cpp和customlayout/flow.cpp。
把列表中在index位置的项拿出来,而不删除它(尽管如果自动删除是生效的。)
返回指向你从列表中拿出的项的指针,或者如果索引超出范围,返回空。有效范围是0..(count() - 1)(包括count()-1)。
如果被移除的项不是列表中最后一项,被移除的项之后的项变为新的当前列表项。如果最后一项被移除,新的最后一项变为当前项。如果列表变空了,当前列表项被设置为空。
所有指向被移除项的列表迭代器都将会被指向新的当前项。
也可以参考remove()、clear()和current()。
这个节点必须存在于列表中,否则程序可能会崩溃。
列表中的第一项变为新的当前列表项。如果列表变空了,当前列表项被设置为空。
所有指向被移除的列表迭代器都被指向这项的下一项或者如果被移除的项是最后一项,则指向它的前一项。
警告:不要调用这个函数,除非你是专家。
也可以参考removeNode()和currentNode()。
矢量必须和项的类型相同,否则结果将会是不确定的。
写一个列表项item到流s中并且返回流的引用。
默认实现是不做任何事。
也可以参考read().
这个文件是Qt工具包一部分。 版权所有 © 1995-2002 Trolltech。保留所有权利。
Copyright © 2002 Trolltech | Trademarks | 译者:Cavendish | Qt 3.0.5版
|