list和雙向鍊錶結構相似,每個節點包含乙個資料塊,前向指標,和後向指標,儲存在非連續的記憶體空間中
很顯然,查詢操作時,只能順序查詢,不支援內部隨機訪問;不像陣列,向量vectoer,佇列可以用下標查詢
但是可以在任意序列位置插入和刪除,這是vector和queue(deque)無法比擬的
而且相比較於vector占用空間更多
list和迴圈鍊錶也有相似的地方,即:頭節點的前驅元素指標域儲存的是鍊錶中尾元素的首位址,list的尾節點的後繼元素指標域則儲存了頭節點的首位址,這樣,list實際上就構成了乙個雙向迴圈鏈。
對於迭代器,只能通過「++」或「--」操作將迭代器移動到後繼/前驅節點元素處。而不能對迭代器進行+n或-n的操作,與vector等不同。
常用操作:
1.list中的建構函式:
list() 宣告乙個空列表;
list(n) 宣告乙個有n個元素的列表,每個元素都是由其預設建構函式t()構造出來的
list(n,val) 宣告乙個由n個元素的列表,每個元素都是由其複製建構函式t(val)得來的
list(first,last) 宣告乙個列表,其元素的初始值**於由區間所指定的序列中的元素 2.
list.push_back()
list.push_front():
分別從list的末端插入,頭部插入元素。3.
list.empty():判斷list是否為空,空則返回true。
4.list.resize():
序列長度調整,原序列超出元素刪除;
如果擴充套件,呼叫預設建構函式t()將元素加到list末端。
如果呼叫resize(n,val),則擴充套件元素要呼叫建構函式t(val)函式進行元素構造;5.
list. clear(): 清空list中的所有元素。
6.
list.front()和list.back(): 分別獲取list首,尾元素
list中元素是空的時候,這時候呼叫front()和back()會發生什麼呢?實際上會發生不能正常讀取資料的情況,但是這並不報錯,最好先呼叫empty()函式判斷list是否為空。
7.
list.pop_back和list.pop_front():分別刪除最後乙個,第乙個元素;序列必須不為空,如果當list為空的時候呼叫pop_back()和pop_front()會使程式崩掉。
8.
assign():具體和vector中的操作類似,
list.assign(n,val) 將 list中元素變為n個t(val)。
list.assign(list2.begin(),list2.end()) 將list2中的從list2.begin()到list2.end()之間的數值賦值給list。
9.
swap():交換兩個鍊錶(兩個過載),
list1.swap(list2);
swap(list1,list2),
都可以完成兩個列表的交換
10.
list.reverse():完成list的反向。
11.
merge():合併兩個鍊錶並使之預設公升序(可修改),
list.merge(list2,greater());
呼叫結束後list2變為空,list1中元素包含原來兩個序列中的元素,並且公升序。
預設是公升序,greater()可以省略。
12.
insert某位置插入值
list.inset(位置,值);
list和迴圈鍊錶也有相似的地方,即:頭節點的前驅元素指標域儲存的是鍊錶中尾元素的首位址,list的尾節點的後繼元素指標域則儲存了頭節點的首位址,這樣,list實際上就構成了乙個雙向迴圈鏈。
STL順序容器 list
list是乙個線性鍊錶結構,它的資料由若干個節點構成,每乙個節點都包括乙個 息塊 即實際儲存的資料 乙個前驅指標和乙個後驅指標。它無需分配指定 記憶體大小且可以任意伸縮,這是因為它儲存在非連續的記憶體空間中,並且由指 針將有序的元素鏈結起來。由於其結構的原因,list 隨機檢索的效能非常的不好,因為...
列表容器list
相對於vector來說,list比較複雜,允許插入,刪除,list節點不保證在儲存空間連續存在,所以必須有指向它的節點,它是雙向環狀鍊錶,需要乙個指標,api為 push front x 把元素 x推入 插入 到鍊錶頭部 pop front 彈出 刪除 鍊錶首元素 merge listref 把 l...
順序容器 List
assign 給list賦值 back 返回最後乙個元素 begin 返回指向第乙個元素的迭代器 clear 刪除所有元素 empty 如果list是空的則返回true end 返回末尾的迭代器 erase 刪除乙個元素 front 返回第乙個元素 get allocator 返回list的配置器 ...