| 主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数 |
QMemArray类是一个提供简单类型的数组的模板类。 详情请见……
#include <qmemarray.h>
QMemArray是作为模板类实现的。定义一个模板实例QMemArray<X>可以创建一个包含X数据项的数组。
QMemArray直接在数组中存储数组元素。它只能处理简单类型(比如,C++类型、结构体和没有构造函数、析构函数和虚函数的类)。QMemArray使用逐位的操作来复制和比较数组元素。
QPtrVector集合类也是一种数组。就像所有的集合类一样,它存储的是指向所包含的数据项的指针。
QMemArray通过一个引用计数器使用明显共享。如果超过一个的数组共享公有的数据并且,一个数组被修改的时候,所有的数组都将被修改。
共享的好处就是程序可以在不被需要复制的时候就不必再复制了,这样的结果就是可以减少的内存使用和数据复制了。
实例:
#include <qmemarray.h>
#include <stdio.h>
QMemArray<int> fib( int num ) // 返回斐波纳契数列
{
Q_ASSERT( num > 2 );
QMemArray<int> f( num ); // 整形数组
f[0] = f[1] = 1;
for ( int i = 2; i < num; i++ )
f[i] = f[i-1] + f[i-2];
return f;
}
int main()
{
QMemArray<int> a = fib( 6 ); // get 6 first fibonaccis
for ( int i = 0; i < a.size(); i++ )
qDebug( "%d: %d", i, a[i] );
qDebug( "1 is found %d times", a.contains(1) );
qDebug( "5 is found at index %d", a.find(5) );
return 0;
}
程序输出:
0: 1
1: 1
2: 2
3: 3
4: 5
5: 8
1 is found 2 times
5 is found at index 4
使用QMemArray来操作结构体或者类的时候需要注意:编译器经常会在结构体后面加一些不定长的东西从而达到最近的字边界。这就将是QMemArray用来做逐位元素比较的大小了。因为剩余的字节将不被初始化,这将导致find()等等在查找元素时失败。实例:
// MyStruct也许会被加上4或8字节
struct MyStruct
{
short i; // 2 bytes
char c; // 1 byte
};
QMemArray<MyStruct> a(1);
a[0].i = 5;
a[0].c = 't';
MyStruct x;
x.i = '5';
x.c = 't';
int i = a.find( x ); // 如果所加上的字节不同,也许会返回-1
为了能在这种情况下工作,确认你使用的结构体使用sizeof()返回到大小和各个成员的大小之和相同,否则通过改变结构体成员的类型或者加入一些虚构的成员来解决这个问题。
QMemArray数据可以通过迭代器来遍历(请看begin()和end())。数据项的数量可以由count()返回。可以用resize()重新定义数组的大小并且用fill()填充。
你可以使用a href="#assign">assign()(或者operator=())来做浅复制,可以使用duplicate()来做深复制。
在数组中搜索值可以用find()和contains()。在排过序的数组(请看sort())中搜索可以使用bsearch()。
你可以直接使用setRawData()和resetRawData()来直接设置数据,但是这需要注意。
也可以参考isNull()。
元素没有被初始化。
也可以参考assign()。
也可以参考operator=()。
浅复制。数组数据的引用计数减一并且相反地引用包含了size个元素的数组数据data。返回这个数组的引用。
在这之后不要删除data,QMemArray会维护它的。
这个可以用来读写一个元素。
也可以参考operator[]()。
返回指向数组开始的一个常量迭代器。这个迭代器与如QValueList和QMap中的迭代器使用方法相同。实际上,它不仅行为和指针相似,它就是一个指针。
返回v的位置,或者如果v没有被找到,返回-1。
也可以参考find()。
也可以参考size()。
如果data()==0(空指针),这个数组为空数组。
也可以参考isNull()。
实例:fileiconview/qfileiconview.cpp和network/networkprotocol/nntp.cpp。
复制操作只有在引用计数比一大的时候执行。
也可以参考copy()。
在QBitArray中被重新实现。
也可以参考copy()。
深复制。当前数组数据的引用计数减一并且相反地获得数组数据data中复制。返回这个数组的引用。数组的大小由size给定。
也可以参考copy()。
返回指向数组最后一个元素之后的一个迭代器。这个迭代器与如QValueList和QMap中的迭代器使用方法相同。实际上,它不仅行为和指针相似,它就是一个指针。
如果成功,返回真,或者如果不能分配内存时(只有当size!=-1时),返回假。
也可以参考resize()。
返回v的位置,或者如果v没有找到,返回-1。
也可以参考contains()。
对于QMemArray,isEmpty()与isNull()相同。(这一点与QString不同)
如果数组为空,返回真,否则返回假。
也可以参考data()。
两个数组进行逐位比较。
也可以参考operator==()。
与 assign( a )相同。
两个数组进行逐位比较。
也可以参考operator!=()。
这个可以用来读写一个元素。与at()相同。
也可以参考at()。
参数必须为data和长度size,它们将被传递给setRawData()。这里是为了一致性检验。
也可以参考setRawData()。
重新定义数组的大小为size个元素(扩大或者缩小)。如果size==0,数组将变为空数组。
如果成功,返回真,或者如果不能分配内存时,返回假。
新元素没有被初始化。
也可以参考size()。
例子:fileiconview/qfileiconview.cpp。
设置原始数据并且返回数组的引用。
当前数组数据的引用计数减一并且设置新的数组数据为data并且新数组大小为size。当原始数据已经被设定之后,不要试图重新定义数组的大小。 Call resetRawData(data, size) to reset the array.
设置原始数据是有用的因为它设置QMemArray数据而没有分配内存或者复制数据。
实例一(故意使用):
static char bindata[] = { 231, 1, 44, ... };
QByteArray a;
a.setRawData( bindata, sizeof(bindata) ); // a指向bindata
QDataStream s( a, IO_ReadOnly ); // 打开a的数据
s >> <something>; // 读取原始的bindata
a.resetRawData( bindata, sizeof(bindata) ); // 完成
实例二(如果你不想这么做):
static char bindata[] = { 231, 1, 44, ... };
QByteArray a, b;
a.setRawData( bindata, sizeof(bindata) ); // a指向bindata
a.resize( 8 ); // 将会崩溃
b = a; // 将会崩溃
a[2] = 123; // 也许会崩溃
// 忘了resetRawData:将会崩溃
警告:如果你没有调用resetRawData(),QMemArray将会试图解除分配或者重新分配原始数据,这也许太不好了。请注意。
也可以参考resetRawData()。
如果size()==0,这个数组是一个空数组。
也可以参考bsearch()。
从pos位置截短数组。
如果成功,返回真,或者如果不能分配内存时,返回假。
与resize(pos)相同。
也可以参考resize()。
也可以参考QDataStream操作符的格。
也可以参考QDataStream操作符的格式。
校验和与字节顺序无关。
这个文件是Qt工具包一部分。 版权所有 © 1995-2002 Trolltech。保留所有权利。
| Copyright © 2002 Trolltech | Trademarks | 译者:Cavendish | Qt 3.0.5版
|