C++容器vector,list,deque

便於在數據結構題目中偷個懶??(還是好好寫ADT⑧)

vector   
vector與數組類似,擁有一段連續的內存空間,並且起始地址不變。便於隨機訪問,時間複雜度爲O(1),但因爲內存空間是連續的,所以在進入插入和刪除操作時,會造成內存塊的拷貝,時間複雜度爲O(n)。

此外,當數組內存空間不足,會採取擴容,通過重新申請一塊更大的內存空間進行內存拷貝。

List
  list底層是由雙向鏈表實現的,因此內存空間不是連續的。根據鏈表的實現原理,List查詢效率較低,時間複雜度爲O(n),但插入和刪除效率較高。只需要在插入的地方更改指針的指向即可,不用移動數據。
deque雙端隊列 double-end queue
deque是在功能上合併了vector和list。
優點:(1) 隨機訪問方便,即支持[ ]操作符和vector.at()
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 佔用內存多

vector<T>(向量容器):用來存放 T 類型的元素,是一個長度可變的序列容器,即在存儲空間不足時,會自動申請更多的內存。使用此容器,在尾部增加或刪除元素的效率最高(時間複雜度爲 O(1) 常數階),在其它位置插入或刪除元素效率較差(時間複雜度爲 O(n) 線性階,其中 n 爲容器中元素的個數);

deque<T>(雙端隊列容器):和 vector 非常相似,區別在於使用該容器不僅尾部插入和刪除元素高效,在頭部插入或刪除元素也同樣高效,時間複雜度都是 O(1) 常數階,但是在容器中某一位置處插入或刪除元素,時間複雜度爲 O(n) 線性階;

list<T>(鏈表容器):是一個長度可變的、由 T 類型元素組成的序列,它以雙向鏈表的形式組織元素,在這個序列的任何地方都可以高效地增加或刪除元素(時間複雜度都爲常數階 O(1)),但訪問容器中任意元素的速度要比前三種容器慢,這是因爲 list 必須從第一個元素或最後一個元素開始訪問,需要沿着鏈表移動,直到到達想要的元素。

forward_list<T>(正向鏈表容器):和 list 容器非常類似,只不過它以單鏈表的形式組織元素,它內部的元素只能從第一個元素開始訪問,是一類比鏈表容器快、更節省內存的容器。
在這裏插入圖片描述

vector

vector的話這篇blog講得很好了,所以本辣雞就不bb了

list

內存空間是不連續的,通過指針來進行數據的訪問
相當於雙向鏈表

推薦blog

  • 聲明及一些操作
#include<iostream>
#include<list>
using namespace std;
list<int> a;
list<int>::iterator t;//迭代器 
int main()
{
	a.empty();//判斷是否爲空
	a.push_back(4);//尾插 
	a.push_front(1); //頭插 
	//a.resize(5);//resize(n)將list的長度改爲只容納n個元素 
	//a.clear()清空所有元素
	cout<<a.front()<<endl;//獲取list容器中的頭部元素
	cout<<a.back()<<endl;  
	a.pop_back();
	a.pop_front();//刪除 
	
	a.reverse();//逆置 
	a.merge(b);//合併兩個鏈表使之默認升序 降序reverse一下不就行了麼...... 
	a.swap(b);//交換
	
	
	for(t=a.begin();t!=a.end();t++)
		cout<<*t<<endl;
}

其它

  • 插入
insert():在指定位置插入一個或多個元素(三個重載):

L1.insert(L1.begin(),100);在L1的開始位置插入100。

L1.insert(L1.begin(),2,200); 在L1的開始位置插入2100。

L1.insert(L1.begin(),L2.begin(),L2.end());在L1的開始位置插入L2的從開始到結束的所有位置的元素。
  • 刪除
erase():刪除一個元素或一個區域的元素(兩個重載)

l1.erase(l1.begin()); 將l1的第一個元素刪除。

l1.erase(l1.begin(),l1.end()); 將l1的從begin()end()之間的元素刪除。

deque

在這裏插入圖片描述
其實差不多…所以簡略一點

相比於 vector
容器,deque的用法幾乎一致但是不同的是deque提供push_front以及pop_front方法,這裏的時間效率是O(1),而vector在頭部插入時要利用insert,後邊的元素要移位,時間爲O(n)。

deque支持[]等運算符操作,用法與vector一致

deque<int> d;
d[3] 就是訪問第4個元素(0,1,2,3

好的就這樣水一下吧
例程

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