便於在數據結構題目中偷個懶??(還是好好寫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
內存空間是不連續的,通過指針來進行數據的訪問
相當於雙向鏈表
- 聲明及一些操作
#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的開始位置插入2個100。
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)
好的就這樣水一下吧
例程