目录
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;
}