Qt中丰富的容器类:数组QVector、链表QLinkedList、映射表QMap、哈希表QHash

目录

Qt中丰富的容器类---数组QVector、链表QLinkedList、映射表QMap、哈希表QHash

---------------------------------------------------

=============================

Qt中丰富的容器类---数组QVector、链表QLinkedList、映射表QMap、哈希表QHash

在C++里做大型程序时,少不了要与数组、链表等数据结构打交道。就是最简单的字符串也常常让头痛万分,Qt中有QString解决了字符串的头痛,那么其他数组等有没有更简单的解决方案呢?Qt作为一款优秀的类型库,当然不会没考虑这些。Qt提供了大量的“容器类”,专门用于以某种方式存储大量内容,QString其实只是这大量的容器类的一种。

我在这里介绍:

QVector(数组)、QLinkedList(链表)、QMap(映射表)、QHash(哈希表)

QVector(数组)

QVector,是Qt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector<int> array(10)

赋值的时候,我们依然可以照旧array[5]=4;想获取某一项的值也还可以array[9],也就是说,原来的特性我们还可以用。

那么QVector有什么好处呢?

·我们可以用count函数获知数组中有多少个元素,方便遍历

·原先我们必须预定义好大小,而用QVector我们虽然最好也先定义好大小,但是预先不定义也可以。

我们可以使用append函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。

QVector<double> vect(2);
vect[0] = 1.0;
vect[1] = 2.0;
for (int i = 0; i < vect.count(); ++i) {
    cout << vect[i] << endl;
}
 
for (int i = 0; i < vect.count(); ++i) {
    cout << vect.at(i) << endl;
}

要使用索引方式設定元素,必須先配置好夠長的空間,否則會發生超出索引範圍的錯誤,使用[]運算子指定索引存取的方式是比較方便,但在某些場合下,使用at()方法會較有效率一些,這涉及Qt的隱式共享機制,稍後再作介紹。
您也可以使用QVector的append()方法來加入元素,使用remove()方法來移除元素,使用insert()方法來插入元素,例如append()的使用如下:

vect.append(3.0);vect.append(4.0);

或者是使用<<運算子附加元素:

vect << 5.0 << 6.0;

QVector 也重載了一些其它的運算子,以及提供了一些其它可用的方法,請查詢Qt線上文件有關於QVector的介紹。QVector提供的是鄰接的 記憶體空間以存取物件,所以對於循序存取或使

QList 的子類別QStringList為Qt中應用很廣的類別,可以讓您儲存QString物件,QList的子類別QQueue則提供了佇列結構的容器管理。
以上先列出QVector、QLinkedList及QList的使用比較:

    如果想要有連續鄰接的記憶體空間來存放元件,則使用QVector 。

    如果需要真正的鏈結資料結構,並使用基於迭代器的存取方式,則使用QLinkedList 。

    在大部份情況下,QList 可以滿足快速存取、插入、移除的需求,並可提供基於索引的存取方式。

QList<QString> list;
list << "caterpillar" << "momor" << "bush";
     
QListIterator<QString> iterator(list);
while (iterator.hasNext()) {
    cout << iterator.next().toAscii().data() << endl;
}

與Java 迭代器類似的,hasNext()測試是否有下一個元素,next()傳回下一個元素,其它還有hasPrevious()、previous()等方法 可以使用。Java風格的迭代器有兩種:唯讀與可讀寫。QListIterator是唯讀迭代器,對於可讀寫迭代器,命名上會加上Mutable,例 如QMutableListIterator,除了next()、previous()等方法之外,還提供了insert()、remove()等方法可 以使用,例如:

QLinkedList<QString> list;
list << "caterpillar" << "momor" << "bush";

QMutableLinkedListIterator<QString> rwIterator(list);

  
while (rwIterator.hasNext())
{
    if(rwIterator.next() == "momor")
    {   rwIterator.insert("bee");  
        break;
    }
}

 
QLinkedListIterator<QString> rIterator(list);
while (
rIterator.hasNext()
)
{ cout << rIterator.next().toAscii().data() << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值