QMemArray类

Qt 3.0.5

主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数

QMemArray类参考

QMemArray类是一个提供简单类型的数组的模板类。 详情请见……

#include <qmemarray.h>

QByteArrayQPointArray继承。

所有成员函数的列表。

公有成员

保护成员

相关函数

  • Q_UINT16 qChecksum ( const char * data, uint len )
  • QDataStream & operator<< ( QDataStream & s, const QByteArray & a )
  • QDataStream & operator>> ( QDataStream & s, QByteArray & a )

详细描述

QMemArray是一个提供简单类型的数组的模板类。

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()来直接设置数据,但是这需要注意。

也可以参考共享类非GUI的类


成员类型文档

QMemArray::ConstIterator

一个常量的QMemArray迭代器。

也可以参考begin()和end()。

QMemArray::Iterator

一个QMemArray迭代器。

也可以参考begin()和end()。


成员函数文档

QMemArray::QMemArray ( int, int ) [保护]

构造一个数组但不分配数组空间。参数必须为(0, 0)。使用的时候你要自己承担风险。

QMemArray::QMemArray ()

构造一个空数组。

也可以参考isNull()。

QMemArray::QMemArray ( int size )

构造一个为size个元素提供空间的数组。如果size==0,就是一个空数组。

元素没有被初始化。

也可以参考resize()和isNull()。

QMemArray::QMemArray ( const QMemArray<type> & a )

构造一个a浅复制

也可以参考assign()。

QMemArray::~QMemArray ()

数组数据的引用计数减一并且如果这是最后一个引用就删除它。

QMemArray<type> & QMemArray::assign ( const QMemArray<type> & a )

浅复制。数组数据的引用计数减一并且相反地引用a中包含的数据。返回这个数组的引用。

也可以参考operator=()。

QMemArray<type> & QMemArray::assign ( const type * data, uint size )

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

浅复制。数组数据的引用计数减一并且相反地引用包含了size个元素的数组数据data。返回这个数组的引用。

在这之后不要删除data,QMemArray会维护它的。

type & QMemArray::at ( uint index ) const

返回数组中在index位置的元素的引用。

这个可以用来读写一个元素。

也可以参考operator[]()。

Iterator QMemArray::begin ()

返回指向数组开始的一个迭代器。这个迭代器与如QValueListQMap中的迭代器使用方法相同。实际上,它不仅行为和指针相似,它就是一个指针。

ConstIterator QMemArray::begin () const

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

返回指向数组开始的一个常量迭代器。这个迭代器与如QValueListQMap中的迭代器使用方法相同。实际上,它不仅行为和指针相似,它就是一个指针。

int QMemArray::bsearch ( const type & v ) const

在排过序的数组中,通过使用二进制搜索找到第一个出现的v。对于排过序的数组,它通常比做线性搜索的find()快很多。

返回v的位置,或者如果v没有被找到,返回-1。

也可以参考sort()和find()。

int QMemArray::contains ( const type & v ) const

返回数组中v出现的次数。

也可以参考find()。

QMemArray<type> QMemArray::copy () const

返回一个数组的深复制

也可以参考detach()和duplicate()。

uint QMemArray::count () const

返回和size()一样的值。

也可以参考size()。

实例:scribble/scribble.cpp

type * QMemArray::data () const

返回实际数组数据的指针。

如果data()==0(空指针),这个数组为空数组。

也可以参考isNull()。

实例:fileiconview/qfileiconview.cppnetwork/networkprotocol/nntp.cpp

void QMemArray::detach () [虚]

把这个数组从共享内存数据中分离出来,比如它做了一次秘密的数据的深复制

复制操作只有在引用计数比一大的时候执行。

也可以参考copy()。

QBitArray中被重新实现。

QMemArray<type> & QMemArray::duplicate ( const QMemArray<type> & a )

深复制。当前数组数据的引用计数减一并且相反地获得a中包含的数据的复制。返回这个数组的引用。

也可以参考copy()。

QMemArray<type> & QMemArray::duplicate ( const type * data, uint size )

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

深复制。当前数组数据的引用计数减一并且相反地获得数组数据data中复制。返回这个数组的引用。数组的大小由size给定。

也可以参考copy()。

Iterator QMemArray::end ()

返回指向数组最后一个元素之后的一个迭代器。这个迭代器与如QValueListQMap中的迭代器使用方法相同。实际上,它不仅行为和指针相似,它就是一个指针。

ConstIterator QMemArray::end () const

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

返回指向数组最后一个元素之后的一个迭代器。这个迭代器与如QValueListQMap中的迭代器使用方法相同。实际上,它不仅行为和指针相似,它就是一个指针。

bool QMemArray::fill ( const type & v, int size = -1 )

用值v来填充数组。如果size被指定为与-1不同的值,数组将在填充之前被重新定义大小。

如果成功,返回真,或者如果不能分配内存时(只有当size!=-1时),返回假。

也可以参考resize()。

int QMemArray::find ( const type & v, uint index = 0 ) const

查找从index位置开始,v第一次出现的位置。

返回v的位置,或者如果v没有找到,返回-1。

也可以参考contains()。

bool QMemArray::isEmpty () const

如果数组是空的,返回真,否则返回假。

对于QMemArray,isEmpty()与isNull()相同。(这一点与QString不同)

bool QMemArray::isNull () const

如果数组为空,返回真,否则返回假。

一个空数组的size()==0并且data()==0。

uint QMemArray::nrefs () const

返回共享数组数据的引用计数。这个引用计数总是比零大。

QMemArray::operator const type * () const

强制性操作符。返回数组的指针。

也可以参考data()。

bool QMemArray::operator!= ( const QMemArray<type> & a ) const

如果这个数组与a不同,返回真,否则返回假。

两个数组进行逐位比较。

也可以参考operator==()。

QMemArray<type> & QMemArray::operator= ( const QMemArray<type> & a )

分配a的一个浅复制到这个数组并且返回这个数组的引用。

assign( a )相同。

bool QMemArray::operator== ( const QMemArray<type> & a ) const

Returns TRUE if this array is equal to a; otherwise returns FALSE. 如果这个数组与a相同,返回真,否则返回假。

两个数组进行逐位比较。

也可以参考operator!=()。

type & QMemArray::operator[] ( int index ) const

返回数组中index位置的元素的引用。

这个可以用来读写一个元素。与at()相同。

也可以参考at()。

void QMemArray::resetRawData ( const type * data, uint size )

使用setRawData()重新设置原始数据。

参数必须为data和长度size,它们将被传递给setRawData()。这里是为了一致性检验。

也可以参考setRawData()。

bool QMemArray::resize ( uint size )

重新定义数组的大小为size个元素(扩大或者缩小)。如果size==0,数组将变为空数组。

如果成功,返回真,或者如果不能分配内存时,返回假。

新元素没有被初始化。

也可以参考size()。

例子:fileiconview/qfileiconview.cpp

QMemArray<type> & QMemArray::setRawData ( const type * data, uint size )

设置原始数据并且返回数组的引用。

当前数组数据的引用计数减一并且设置新的数组数据为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()。

uint QMemArray::size () const

返回数组大小(元素的最大数量)。

如果size()==0,这个数组是一个空数组。

也可以参考isNull()和resize()。

void QMemArray::sort ()

把数据元素按升序排列,使用逐位比较(memcmp())。

也可以参考bsearch()。

bool QMemArray::truncate ( uint pos )

pos位置截短数组。

如果成功,返回真,或者如果不能分配内存时,返回假。

resize(pos)相同。

也可以参考resize()。


相关函数

QDataStream & operator<< ( QDataStream & s, const QByteArray & a )

从字节数组a写到s流中并且返回流的引用。

也可以参考QDataStream操作符的格

QDataStream & operator>> ( QDataStream & s, QByteArray & a )

s流中到读取字节数组a中并且返回流的引用。

也可以参考QDataStream操作符的格式

Q_UINT16 qChecksum ( const char * data, uint len )

返回data开始的len字节的CRC-16的校验和。

校验和与字节顺序无关。


这个文件是Qt工具包一部分。 版权所有 © 1995-2002 Trolltech。保留所有权利。


Copyright © 2002 Trolltech Trademarks 译者:Cavendish
Qt 3.0.5版