STL學習總結之容器
STL介紹
STL(Standard Template Library,標準模板庫),是惠普實驗室開發的一系列軟體的統稱。現在主要出現在 c++中,但是在引入 c++之前該技術已經存在很長時間了。STL 從廣義上分為: 容器(container) 演算法(algorithm) 迭代器(iterator),容器和演算法之間通過迭代器進行無縫連線。STL 幾乎所有的程式碼都採用了模板類或者模板函式,這相比傳統的由函式和類組成的庫來說提供了更好的程式碼重用機會。
STL組成構件
簡單來說;
容器:類似資料結構,陣列,連結串列,棧,佇列等等。
演算法:一些演算法方式,一些排序演算法,提供任何資料型別。
迭代器:將演算法和容器進行連結。
STL 優點:高可重用性,高效能,高移植性,跨平臺。
vector
圖解:
介紹
它是單端陣列,只能對該陣列的一端進行插入和刪除,他是一個動態陣列,支援隨機訪問,存在自己的迭代器。
特點
vector 是動態陣列,連續記憶體空間,具有隨機存取效率高的優點。
vector 是單口容器,在隊尾插入和刪除元素效率高,在指定位置插入會導致資料元素移動,效率低。
應用例子
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
vector<int> v;
//插入元素10
for (int i = 0; i < 10;i++)
v.push_back(i);
//得到容器的迭代器
vector<int>::iterator it_begin = v.begin();
vector<int>::iterator it_end = v.end();
//遍歷vector容器,將容器中的元素,輸出
for (vector<int>::iterator it=v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
vector<int>v1(v);
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << endl;
}
cout << "v1.front():" << v1.front() << endl;
cout << "v1.back():" << v1.back() << endl;
cout << "v1[2]" << v1[2]<<endl;
return 0;
}
deque
圖解:
介紹:
它可以理解為一個雙端陣列,這個陣列的兩端都可以插入和彈出,支援隨機訪問,有自己的迭代器。
特點
雙端插入和刪除元素效率較高.
指定位置插入也會導致資料元素移動,降低效率.
可隨機存取,效率高.
應用例子
#include<iostream>
#include<deque>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
deque<int> q;
q.push_front(3);
q.push_back(5);
q.push_front(11);
for (deque<int>::iterator it = q.begin(); it != q.end(); it++)
{
cout << *it << endl;
}
cout <<"queue.at(2)"<<q.at(2) << endl;
cout << "queue.front()"<<q.front() << endl;
cout << "queue.back()"<<q.back() << endl;
cout << "q[1]" << q[1] << endl;
return 0;
}
stack
圖解:
介紹:
stack 是一種先進後出(first in last out,FILO)的資料結構,它只有一個出口,stack 只允許在棧頂新增元素,移除元素,獲得頂端元素,但是除了頂端之外,其他地方不允許存取元素,只有棧頂元素可以被外界使用,也就是說 stack 不能遍歷,沒有迭代器。
特點
棧不能遍歷,不支援隨機存取,只能通過 top 從棧頂獲取和刪除元素
應用例子
#include<iostream>
#include<stack>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
stack<int>s;
s.push(12);
s.push(15);
s.push(55);
cout << "s.size()" << s.size() << endl;
while (!s.empty())
{
cout << s.top() << endl;
s.pop();
}
cout << "s.size()" << s.size() << endl;
return 0;
}
queue
圖解:
介紹:
queue 是一種先進先出(first in first out, FIFO)的資料型別,他有兩個口,資料元素只能從一個口進,從另一個口出.佇列只允許從隊尾加入元素,隊頭刪除元素,必須符合先進先出的原則,queue 和 stack 一樣不具有遍歷行為。
特定
必須從一個口資料元素入隊,另一個口資料元素出隊。
不能隨機存取,不支援遍歷
應用例子
#include<iostream>
#include<queue>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
queue<int> q;y
q.push(3);
q.push(6);
q.push(9);
while (!q.empty())
{
cout << q.front() << endl;
q.pop();
}
return 0;
}
list
圖解:
介紹:
連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。
特點
採用動態儲存分配,最大化利用記憶體
連結串列執行插入和刪除操作十分方便,修改指標即可,不需要移動大量元素
連結串列靈活,但是空間和時間額外耗費較大
應用例子
#include<iostream>
#include<list>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
list<int> l;
l.push_front(12);
l.push_front(13);
l.push_front(33);
l.push_back(99);
for (list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << endl;
}
cout << "l.size(3)=" << l.size() << endl;
cout << "l.front()=" << l.front() << endl;
cout << "l.back()=" << l.back() << endl;
return 0;
}
set
介紹:
借用平衡二叉樹的結構,來實現對資料的自動排序,set 容器中不允許重複元素,multiset 允許重複元素。
應用例子
#include<set>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
set<int> s;
s.insert(11);
s.insert(1);
s.insert(22);
s.insert(66);
s.insert(88);
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << endl;
}
set<int>::iterator lo = s.lower_bound(22);//返回第一個 key>=keyElem 元素的迭代器。
set<int>::iterator up = s.upper_bound(22);//返回第一個 key>keyElem 元素的迭代器。
pair<set<int>::iterator ,set<int>::iterator> equal =s.equal_range(22);//返回容器中 key 與 keyElem 相等的上下限的兩個迭代器。
cout <<"*lo=" <<*lo << endl;
cout << "*up=" << *up << endl;
cout <<"*(equal.first)="<<*(equal.first) << endl;
cout << "*(equal.second)=" << *(equal.second) << endl;
return 0;
}
map
介紹:
map 相對於 set 區別,map 具有鍵值和實值,所有元素根據鍵值自動排序。pair 的第一元素被稱為鍵值,第二元素被稱為實值。map 也是以紅黑樹為底層實現機制。map 和 multimap 區別在於,map 不允許相同 key 值存在,multimap 則允許相同key 值存在。
應用例子
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
map<int, int> m;
m.insert(make_pair(1,1));
m.insert(make_pair(2,2));
m.insert(make_pair(3,3));
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout <<"it->first="<<it->first<<" ";
cout << "it->second" << it->second << endl;
}
return 0;
}