Qt的容器類之容器,迭代器

2021-07-25 08:42:57 字數 2473 閱讀 6490

qt中的容器被分為兩個大類:容器元素是乙個值的,比如qvector,以及容器元

素是乙個(key, value)對的,比如qmap。

(1)第一大類中,qvector將其所有元素存放在一塊連續的記憶體中。隨機訪問的速度很快,

但是插入/刪除操作很慢。

qstack是qvector的子類,實現棧的功能。除了具有

qvector的所有功能,它的成員函式push(). pop(). top()實現棧的操作。

qlist在內部使用乙個指標陣列指向容器元素。能夠快速隨機訪問每個元素。在容器

首、尾新增元素的速度也較快。但是,當元素數量較多而需要在容器中間插入新元素時,需

要移動大量的指標,效能會降低。

qstringlist是qlist的子類,能高效地處理字串列表。比如,它支援運算子

,』<

函式filter()能夠使用正規表示式搜尋字串列表。

qqueue是qlist的子類,實現了佇列的功能。除了具有qlist的所有功能外,它

的成員函式enqueue()將乙個新元素新增到容器尾部,dequeue()從容器首部刪除乙個元素,

head()訪問但是不刪除首部元素。

qlinkedlist能夠在很短而且固定的時間內完成元素的插入/刪除操作,但是排序、查

找操作卻較慢。

(2)第二大類中,qmap的元素具有(key,value)形式。所有元素按照key的取值排序,

因而搜尋速度很快。乙個容器的多個元素都具有相同的key。雖然qmap也能處理這種情況,

但是處理方式煩瑣。qmultimap能夠更有效地處理這種情形。它是qmap的子類,

除了具有qmap的絕大部分功能,它的insert函式允許新元素的key和己有元素的key相同。

它不支援運算子「」,取而代之的是函式values(),該函式返回所有具有指定key值的元素,

並將它們存放在乙個qlist物件中。

qhash的元素也具有(key,value)的形式。它使用雜湊表訪問key,因而能夠快速

地依據key定位某個元素,這個操作的速度比qmap的快。但是,qhash中的元素並沒有按

照key的取值排序,降低了搜尋的效能。為了處理多個元素具有相同key的情形,qhash也

具有乙個子類qmultihash,其功能與qmultimap類似。

qset內部使用qhash實現集合的功能。qhash的每個元素具有(key,value)形式,

qset令key為t, value為空。由於使用了qhash, qset能夠快速完成集合的插入、元素

定位操作。成員函式unite()合併兩個集合,intersect()求取兩個集合的交集,substract()求取兩

個集合之差,contains()判斷乙個集合是否含有某個元素。

qcache的元素也具有(key,value)的形式。和其他容器不同,qcache所能存放的

元素數量被有意地限定。當有新元素需要被插入到容器中時,最近使用頻率最低的那些元素

會被刪除。

如何遍歷乙個容器,兩種方法,第一使用迭代器,第二使用qt定義的關鍵字foreach。

foreach最終依靠迭代器來完成遍歷操作,但是使用方法很簡潔。一般格式如下:

foreach (variable ,container) statement;

其中variable的型別應該和container中元素的型別一致。如果這個型別的名字中不含有逗號,

這個變數可以在foreach內部定義,不必提前定義。

例如:1.使用迭代器

qlist

<

qstring

> list;

list << "a" << "b" << "c" << "d";
qlist

<

qstring

>::iterator i;

for (i = list.begin(); i != list.end(); ++i)
qdebug()<< *i ;
2.使用foreach
qlinkedlist

<

qstring

> list;

list << "a" << "b" << "c" << "d";

foreach

(const

qstring

&str, list)

qdebug

() << str;

foreach在遍歷乙個容器前,會複製該容器,然後對複製的版本進行遍歷。如果在遍歷的

過程中修改了容器元素的值,那也只是修改這個複製版本,對原容器不會產生任何影響。由於

qt採用了隱式共享技術,這個複製操作會很快完成。如果使用者希望在迭代的過程中修改

原容器,就應該使用迭代器。

容器的內嵌類 迭代器

容器是c stl庫里實現的重要結構,這裡簡單實現鍊錶的構造以及遍歷操作。在stl庫里實現了容器的迭代器,用於遍歷容器中的部分或全部元素。在這裡我們來模擬實現迭代器的簡單遍歷,以及容器迭代器介面的實現。節點 template struct listnode t data listnode next l...

容器類的迭代器討論

一級容器包括 順序容器 和 關聯容器 容器介面卡不屬於一級容器 迭代器用於訪問和控制一級容器中的元素 為什麼容器介面卡不支援?因為容器介面卡依賴某一種具體容器實現。前向迭代器也可以支援前向 和後向 lis支援雙向迭代器,然而queue是容器介面卡,不支援迭代器 輸入迭代器用於讀入資料,輸出迭代器用於...

容器 迭代器

stl包括 容器 資料結構 迭代器 遍歷資料 演算法 順序容器 vector 向量 list 鍊錶 deque 雙端佇列 關聯容器 set 集合 multist map 對映 multimap 迭代器 類似於指標 用來訪問容器中的單個資料項 迭代器由類iterator來宣告。include incl...