主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数 | ![]() |
QValueList类是一个提供双向链表的基于值的模板类。 详情请见……
#include <qvaluelist.h>
被QCanvasItemList、QStringList和QValueStack继承。
QValueList是一个像STL一样的列表容器的Qt的实现。如果标准列表不能提供时,你可以在你的应用程序中使用它。QValueList是Qt模板库的一部分。
QValueList<T>定义了一个创建了一个全部为类T的值的列表的一个模板实例。注意QValueList不是存储指针为列表的成员,它保存每个成员的复制。这也就是为什么这些类被称为“基于值”,而QPtrList和QDict是“基于指针”。
QValueList包含并管理一个类型为T的对象的集合并且提供允许找到被包含的对象的迭代器。QValueList拥有它的项。关于更多的所有权语义,请参考QPtrCollection和其它一些基于指针的容器类。
一些类不能在QValueList中使用,例如,所有继承于QObject的类和那些所有实现窗口部件的类。只有值可以用在QValueList中。一个类作为值必须提供以下几点:
注意在没有明确的版本被提供的时候,C++默认实现操作符和复制函数。在很多情况下,这就足够了。
QValueList的函数命名和其它Qt类是一致的(比如,count()、isEmpty())。QValueList也提供兼容STL算法的一些函数,比如size()和empty()。已经熟悉STL的list的程序员也可以使用这些函数。
实例:
class Employee { public: Employee(): sn(0) {} Employee( const QString& forename, const QString& surname, int salary ) : fn(forename), sn(surname), sal(salary) {} QString forename() const { return fn; } QString surname() const { return sn; } int salary() const { return sal; } void setSalary( int salary ) { sal = salary; } private: QString fn; QString sn; int sal; }; typedef QValueList<Employee> EmployeeList; EmployeeList list; list.append( Employee("John", "Doe", 50000) ); list.append( Employee("Jane", "Williams", 80000) ); list.append( Employee("Tom", "Jones", 60000) ); Employee mary( "Mary", "Hawthorne", 90000 ); list.append( mary ); mary.setSalary( 100000 ); EmployeeList::iterator it; for ( it = list.begin(); it != list.end(); ++it ) cout << (*it).surname().latin1() << ", " << (*it).forename().latin1() << " earns " << (*it).salary() << endl; // 输出: // Doe, John earns 50000 // Williams, Jane earns 80000 // Hawthorne, Mary earns 90000 // Jones, Tom earns 60000
注意最后对Mary的薪水的改变并没有影响列表中的值,这是因为列表中创建了一个Mary条目的复制。
这里有几种方法在列表中找到项。begin()和end()函数返回列表中开始和结尾的迭代器。迭代器的优点是你可以通过对迭代器加/减就可以实现从当前位置向前/后移动了。end()返回的迭代器指向的是容器中最后一个之后的值。结尾之后的迭代器也是和列表关联的,它属于列表,尽管它是不可以解除引用的,operator*()不能返回一个被良好定义的值。如果列表是空的(empty()),begin()和end()返回的值一样。
另一个在列表中找到项的方法是使用qFind()算法。比如:
QValueList<int> list; ... QValueList<int>::iterator it = qFind( list.begin(), list.end(), 3 ); if ( it != list.end() ) // it指向被找到的项。
同一时间在列表中使用多个迭代器是安全的。如果列表中的一些成员被移除,只有那些指向被移除的成员的迭代器变为无效。向列表中插入项不会使任何一个迭代器无效。为了方便,函数last()返回列表中最后一个项的引用,并且first()返回第一个项的引用。如果列表为空(empty()),last()和first()都会有未定义的行为发生(你的应用程序将会崩溃或者会做一些不可预知的事情)。使用last()和first()时需要注意,比如:
QValueList<int> list; list.append( 1 ); list.append( 2 ); list.append( 3 ); ... if ( !list.empty() ) { // OK, modify the first item int& i = list.first(); i = 18; } ... QValueList<double> dlist; double d = dlist.last(); // undefined
因为QValueList是基于值的,所以在删除列表中的项时,就没有什么要注意的了。列表保存它自己的复制并且如果相应的项或者列表本身被删除时,列表会释放它们。你可以使用clear()来强制列表释放它所有的项。
QValueList是隐含地共享,这也就是说它能够在一个固定时间被复制。如果多个QValueList实例共享相同的数据并且一个需要修改它的内容,这个修改实例将会产生一个复制并且只修改它自己的复制,因此它对其它实例来说是无效的。这就是常说的“写时复制”。如果一个QValueList是在一个多线程程序中被使用,你必须保护所有对列表的访问。请参考QMutex。
向列表中插入项有好几个方法。prepend()和append()函数分别把项插入到列表的开始和结尾。insert()函数有好几种方式并且可以被用来向列表中的特定位置插入一个或多个项。
从列表中移除项也有好几个方法。remove()函数有好几种方式并且可以用来移除列表中的特定项。remove()函数可以根据特定的项的值来找到这个项并且删除它。
列表可以使用sort()函数来排序,或者使用Qt模板库来排序。比如使用qHeapSort():
实例:
QValueList<int> l; l.append( 5 ); l.append( 8 ); l.append( 3 ); l.append( 4 ); qHeapSort( l );
也可以参考QValueListIterator、Qt模板库类、隐含地和明示地共享类和非GUI类。
这个迭代器是QValueListConstIterator的一个实例,类型和QValueList一样。换句话说,如果你QValueList<int>这样示例,ConstIterator就是QValueListConstIterator<int>。几个成员函数使用它,比如QValueList::begin(),它返回一个指向列表中第一个项的迭代器。
在功能上,它和Iterator基本一样。唯一的区别是你不能使用ConstIterator做非常量操作并且如果你使用ConstIterator,编译器经常会产生更好的代码。
也可以参考QValueListIterator和Iterator。
这个迭代器是QValueListIterator的一个实例,类型和QValueList一样。换句话说,如果你QValueList<int>这样示例,Iterator就是QValueListIterator<int>。几个成员函数使用它,比如QValueList::begin(),它返回一个指向列表中第一个项的迭代器。
在功能上,它和ConstIterator基本一样。唯一的区别是你不能使用ConstIterator做非常量操作并且如果你使用ConstIterator,编译器经常会产生更好的代码。
也可以参考QValueListIterator和ConstIterator。
构造一个l的复制。
这个操作使用了O(1)时间,因为QValueList是隐含地共享。
第一次对列表的修改会使用O(n)时间。
构造一个l的复制。
这个构造函数提供了和STL容器的兼容。
销毁这个列表。在列表中的值的引用和这个列表的所有迭代器都会变为无效。注意检查一个迭代器是否有效将是不可能的——因为QValueList已经为效率而优化了,而不是为错误检查。
在列表结尾插入x。
实例:checklists/checklists.cpp和fonts/simple-qfont-demo/viewer.cpp。
返回指向列表中位置为i的项的迭代器,或者如果索引超出范围,返回end()。
警告:这个函数使用的是线性搜索并且对于大的列表这将会非常慢。QValueList没有对随机项访问进行优化。如果你需要随机访问,请使用一个不同的容易,比如QValueVector。
返回指向列表中位置为i的项的迭代器,或者如果索引超出范围,返回end()。
返回指向最后一个项的引用。如果列表中没有最后一个项(比如,empty()返回真),返回值是未定义的。
这个函数的提供是为了兼容STL。它和last()是一样的。
也可以参考front()。
返回指向列表中第一个项的迭代器。如果列表为空,这个迭代器等于end()。
实例:chart/canvasview.cpp、chart/element.cpp、checklists/checklists.cpp、fonts/simple-qfont-demo/viewer.cpp、network/ftpclient/ftpview.cpp、table/statistics/statistics.cpp和themes/themes.cpp。
返回指向列表中第一个项的迭代器。如果列表为空,这个迭代器等于end()。
移除列表中所有的项。
也可以参考remove()。
返回列表中值x出现的次数。
返回列表中项的数量。
也可以参考isEmpty()。
实例:chart/element.cpp和table/statistics/statistics.cpp。
如果列表中没有包含任何项,返回真,否则返回假。
也可以参考size()。
返回一个指向列表中最后一项之后的迭代器。如果列表为空,这个迭代器等于begin()。
实例:chart/canvasview.cpp、chart/element.cpp、checklists/checklists.cpp、fonts/simple-qfont-demo/viewer.cpp、network/ftpclient/ftpview.cpp、sql/overview/insert/main.cpp和table/statistics/statistics.cpp。
返回一个指向列表中最后一项之后的迭代器。如果列表为空,这个迭代器等于begin()。
从列表中移除it所指向的项。除了it之外其它指向相同项的迭代器一样都无效了。返回一个指向it之后的下一个项的迭代器,或者如果没有这样的项,返回end()。
这个函数的提供是为了兼容STL。它等于remove()。
删除从first到last的所有项(不包括last)。除了指向被移除项的迭代器,其它迭代器都有效。返回last。
返回指向列表中第一次出现x的迭代器。
如果没有项匹配,返回end()。
返回指向列表中第一次出现x的迭代器。
如果没有项匹配,返回end()。
返回指向列表中从it开始第一次出现x的迭代器。
如果没有项匹配,返回end()。
返回指向列表中从it开始第一次出现x的迭代器。
如果没有项匹配,返回end()。
返回列表中值x第一次出现的索引。如果没有项匹配,返回-1。
返回第一个项的引用。如果列表中没有第一个项(比如,empty()返回真),返回值是未定义的。
也可以参考last()。
返回指向列表中最后一项的迭代器,或者如果列表中没有最后一项,返回end()。
可以使用end()函数替换。例如:
QValueList<int> l; …… QValueList<int>::iterator it = l.end(); --it; if ( it != end() ) // ……
返回指向列表中最后一项的迭代器,或者如果列表中没有最后一项,返回end()。
可以使用end()函数替换。例如:
QValueList<int> l; …… QValueList<int>::iterator it = l.end(); --it; if ( it != end() ) // ……
返回列表中第一个项的引用。如果列表中没有第一个项(比如,empty()返回真),返回值是为定义的。
这个函数的提供是为了兼容STL。它等于first()。
也可以参考back()。
在迭代器it之前插入值x。
返回指向被插入项的迭代器。
在位置pos之前,插入x的n个复制。
如果列表没有包含任何项,返回真,否则返回假。
也可以参考count()。
实例:fonts/simple-qfont-demo/viewer.cpp、network/ftpclient/ftpmainwindow.cpp和network/mail/smtp.cpp。
返回列表中最后一项的引用。如果列表中没有最后一项(比如,empty()返回真),返回值是为定义的。
比较两个列表。
如果这个列表和l不等,返回真,否则返回假。
创建一个新的列表并且用这个列表的项来填充它。然后l项被添加。返回新的列表。
向这个列表添加l项。返回这个列表的引用。
向这个列表添加值x。返回这个列表的引用。
在列表末尾添加值x。返回这个列表的引用。
把l赋值给这个列表并且返回这个列表的引用。
当前列表的所有迭代器都因为这个操作而变为无效。这个赋值操作消耗O(1)时间,因为QValueList是隐含地共享
把l的内容赋值给这个列表。
当前列表的所有迭代器都因为这个操作而变为无效。
比较两个列表。
如果这个列表和l相等,返回真,否则返回假。
如果这个列表和l相等,返回真,否则返回假。
这个操作符的提供是为了和STL容器兼容。
返回列表中索引为i的项的常量引用。由你来决定检查它是否真的存在。你可以很容易地使用count()函数做到这一点。无论如何,这个操作符没有检查i是否在范围之内并且如果它不存在,将会递送未定义的结果。
警告:这个函数使用的是线性搜索并且对于大的列表这将会非常慢。QValueList没有对随机项访问进行优化。如果你需要随机访问,请使用一个不同的容易,比如QValueVector。
Returns a non-const reference to the item with index i.
移除列表中的最后一项。如果没有最后一项,这个操作是未定义的。
这个函数的提供是为了兼容STL。
移除列表中的第一个项。如果没有第一个项,这个操作是未定义的。
这个函数的提供是为了兼容STL。
在列表的开始插入x。
在列表的末尾插入x。
这个函数的提供是为了兼容STL。它等于append()。
在列表的开始插入x。
这个函数的提供是为了兼容STL。它等于prepend()。
移除列表中it所指向的项。除了it之外其它指向相同项的迭代器一样都无效了。返回一个指向it之后的下一个项的迭代器,或者如果没有这样的项,返回end()。
也可以参考clear()。
移除所有值为x的项并且返回被移除项的数量。
Returns the number of items in the list.
这个函数的提供是为了兼容STL。它等于count()。
也可以参考empty()。
实例:network/ftpclient/ftpview.cpp。
写一个列表l到流s中。存储在列表中的类型T也必须实现了这个操作符。
从流s中读取一个列表l。存储在列表中的类型T也必须实现了这个操作符。
这个文件是Qt工具包一部分。 版权所有 © 1995-2002 Trolltech。保留所有权利。
Copyright © 2002 Trolltech | Trademarks | 译者:Cavendish | Qt 3.0.5版
|