STL教程(三)——list

如需轉載,請註明出處。

感覺list無需說過多的內容,原理大家都懂得。直接調用接口就行了。因此熟悉如何用其成員函數,並在適當的時候用到它就行。

  • List是一個連續的容器,而vector是一個非連續的容器,即list將元素存儲在一個連續的內存中,而vector存儲在一個非連續的內存中。
  • 在Vector中間插入和刪除是非常昂貴的,因爲它需要花費大量時間來移動所有元素。 鏈表克服了這個問題,並使用list容器實現。
  • list支持雙向,爲插入和刪除操作提供了有效的方法。
  • 遍歷在列表中很慢,因爲列表元素是順序訪問的,而向量支持隨機訪問。

list是允許非連續內存分配的序列容器。與向量相比,list具有慢遍歷,但是一旦找到位置,插入和刪除就很快。通常,當我們說list時,我們談論雙向鏈表。爲了實現單鏈表,我們使用forward list。

list模板

#include<iostream>  
#include<list>  
using namespace std;  
int main()  
{  
   list<int> l;  
}  

它創建一個整數類型值的空列表。

list也可以使用參數初始化。

#include<iostream>  
#include<list>  
using namespace std;  
int main()  
{  
   list<int> l{1,2,3,4};  
}  

list可以通過兩種方式初始化。

list<int>  new_list{1,2,3,4};  
or  
list<int> new_list = {1,2,3,4};  

下面是顯示list的一些函數的工作情況:

#include <iostream> 
#include <list> 
#include <iterator> 
using namespace std; 

//function for printing the elements in a list 
void showlist(list <int> g) 
{ 
	list <int> :: iterator it; 
	for(it = g.begin(); it != g.end(); ++it) 
		cout << '\t' << *it; 
	cout << '\n'; 
} 

int main() 
{ 

	list <int> gqlist1, gqlist2; 


	for (int i = 0; i < 10; ++i) 
	{ 
		gqlist1.push_back(i * 2); 
		gqlist2.push_front(i * 3); 
	} 
	cout << "\nList 1 (gqlist1) is : "; 
	showlist(gqlist1); 

	cout << "\nList 2 (gqlist2) is : "; 
	showlist(gqlist2); 

	cout << "\ngqlist1.front() : " << gqlist1.front(); 
	cout << "\ngqlist1.back() : " << gqlist1.back(); 

	cout << "\ngqlist1.pop_front() : "; 
	gqlist1.pop_front(); 
	showlist(gqlist1); 

	cout << "\ngqlist2.pop_back() : "; 
	gqlist2.pop_back(); 
	showlist(gqlist2); 

	cout << "\ngqlist1.reverse() : "; 
	gqlist1.reverse(); 
	showlist(gqlist1); 

	cout << "\ngqlist2.sort(): "; 
	gqlist2.sort(); 
	showlist(gqlist2); 

	return 0; 

} 

上述程序的輸出是:

List 1 (gqlist1) is :     0    2    4    6    
8    10    12    14    16    18

List 2 (gqlist2) is :     27    24    21    18    
15    12    9    6    3    0

gqlist1.front() : 0
gqlist1.back() : 18
gqlist1.pop_front() :     2    4    6    8    
10    12    14    16    18

gqlist2.pop_back() :     27    24    21    18    
15    12    9    6    3

gqlist1.reverse() :     18    16    14    12    
10    8    6    4    2

gqlist2.sort():     3    6    9    12    
15    18    21    24    27

與list一起使用的函數:

front()      - 返回列表中第一個元素的值。
back()       - 返回列表中最後一個元素的值。
push_front(g)- 在列表的開頭添加一個新元素“g”。
push_back(g) - 在列表末尾添加一個新元素“g”。
pop_front()  - 刪除列表的第一個元素,並將列表的大小減小1。
pop_back()   - 刪除列表的最後一個元素,並將列表的大小減小1
begin()      -返回一個指向列表第一個元素的迭代器
end()        -返回一個迭代器,指向最後一個元素後面的理論最後一個元素。
rbegin()     -返回一個反向迭代器,它指向列表的最後一個元素。
rend()       -返回一個反向迭代器,它指向列表開頭之前的位置。
cbegin()     -返回一個指向列表開頭的常量隨機訪問迭代器。 
cend()       -返回一個指向列表末尾的常量隨機訪問迭代器。
crbegin()    -返回一個常量反向迭代器,它指向列表的最後一個元素,即容器的反向開頭。 
crend()      -返回一個常量反向迭代器,它指向列表中第一個元素之前的理論元素,即列表的反向末尾。
empty()      - 返回列表是空(1)還是不(0)。
insert()     - 在元素之前的列表中插入新元素到指定位置。
erase()      - 從列表中刪除單個元素或一系列元素。
assign()     - 通過替換當前元素並將列表調整大小,將新元素分配給列表。
remove()     - 從列表中刪除所有與給定元素相等的元素。
remove_if()  -用於從列表中刪除與作爲函數參數給出的謂詞或條件相對應的所有值。
reverse()    - 反轉列表。
size()       - 返回列表中的元素數。
resize()     -用於調整列表容器的大小。
sort()       - 按遞增順序對列表進行排序。
max_size()   -返回列表容器可容納的最大元素數。
unique()     -從列表中刪除所有重複的連續元素。
emplace_front()   -用於將新元素插入到列表容器中,新元素被添加到列表的開頭。 
emplace_back()    -用於將新元素插入到列表容器中,新元素被添加到列表的末尾。
clear()      -用於刪除列表容器的所有元素,從而使其大小爲0。
operator =     -此運算符用於通過替換現有內容將新內容分配給容器。
swap()       -此函數用於將一個列表的內容與另一個相同類型和大小的列表交換。
splice()     -用於將元素從一個列表傳輸到另一個列表。
merge()      -將兩個排序列表合併爲一個
emplace()    -通過在給定位置插入新元素來擴展列表。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章