一.STL簡介
1.簡介
STL<標準模板庫>是通用類模板和算法的集合,他提供給程序員一些標準的數據結構的實現。
2.三類數據結構
1.順序性容器
vector 從後面快速的插入與刪除,直接訪問任何元素
deque 從前面或後面快速的插入與刪除,直接訪問任何元素
list 雙鏈表,從任何地方快速插入與刪除
2.關聯容器
set 快速查找,不允許重複值
multiset 快速查找,允許重複值
map 一對多映射,基於關鍵字快速查找,不允許重複值
multimap 一對多映射,基於關鍵字快速查找,允許重複值
3.容器適配器
stack 後進先出
queue 先進先出
priority_queue 最高優先級元素總是第一個出列
二.順序性容器
1.C++ Vector(向量容器)
1).特點
1.看作動態數組,指定一塊如同數組一樣的連續存儲,但空間可以動態擴展
2.隨機訪問方便
3.連續存儲節省空間
4.內部插入、刪除效率低下,只能在後端進行追加和刪除
5.動態添加的數據超過vector默認分配的大小進行內存重新分配、拷貝和釋放,操作非常消耗性能
2)語法
1. Constructors 構造函數
vector<int> v1; //構造一個空的vector
vector<int> v1( 5, 42 ); //構造了一個包含5個值爲42的元素的Vector
2.at() 返回指定位置的元素
TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;
3.empty() 判斷Vector是否爲空(返回true時爲空)
4. pop_back() 移除最後一個元素
5.push_back() 在Vector最後添加一個元素
2.C++ List (雙向鏈表)
1)特點
1.不使用連續的內存空間,隨意進行動態操作
2.任何位置快速進行插入和刪除
3.不能進行內部的隨機訪問,不支持[ ]操作符和vector.at()<返回指定位置的元素>;
2)語法
1.assign() 給list賦值
void assign( input_iterator start, input_iterator end ); //以迭代器start和end指示的範圍爲list賦值
void assign( size_type num, const TYPE &val ); //賦值num個以val爲值的元素。 2.back() 返回最後一個元素的
2. erase() 刪除一個元素
iterator erase( iterator loc );//刪除loc處的元素
iterator erase( iterator start, iterator end ); //刪除start和end之間的元素
3.insert() 插入一個元素到list中
iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值爲val的元素,返回指向這個元素的迭代器
void insert( iterator loc, size_type num, const TYPE &val ); //定位置loc前插入num個值爲val的元素
void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入區間[start, end)的所有元素
4.splice() 合併兩個list
void splice( iterator pos, list &lst );//把lst連接到pos的位置
void splice( iterator pos, list &lst, iterator del );//插入lst中del所指元素到現鏈表的pos上
void splice( iterator pos, list &lst, iterator start, iterator end );//用start和end指定範圍。
3.C++ Deque(雙向隊列)
1)特點
1.隨機訪問方便,支持[]操作符和vector.at(),性能沒有vector好
2.可以在兩端進行插入和刪除操作,但性能不及list
3.可以在兩端進行push、pop
4.相對於vector佔用更多的內存。雙向隊列和向量很相似,但是它允許在容器頭部快速插入和刪除(就像在尾部一 樣)。
2)語法
1.1.Constructors 創建一個新雙向隊列
deque();//創建一個空雙向隊列
deque( size_type size );// 創建一個大小爲size的雙向隊列
deque( size_type num, const TYPE &val ); //放置num個val的拷貝到隊列中
deque( const deque &from );// 從from創建一個內容一樣的雙向隊列
deque( input_iterator start, input_iterator end ); // start 和 end - 創建一個隊列,保存從start到end的元素。
4.三者比較
1.vector 是一段連續的內存塊,而deque 是多個連續的內存塊, list 是所有 數據元素分開保存,可以是任何兩個元素沒有連續。 據元素分開保存,可以是任何兩個元素沒有連續。
2.vector 的查詢性能最好,並且在末端增加數據也很好,除非它重新申請內存 段;適合高效地隨機存儲。
3.list 是一個鏈表,任何一個元素都可以是不連續的,但它都有兩個指向上一 元素和下一元素的指針。所以它對插入、刪除元素性能是最好的,而查詢性能非 常差;適合大量地插入和刪除操作而不關心隨機存取的需求。
4.deque 是介於兩者之間,它兼顧了數組和鏈表的優點,它是分塊的鏈表和多 個數組的聯合。所以它有被list好的查詢性能,有被vector好的插入、刪除性能。 如果你需要隨即存取又關心兩端數據的插入和刪除,那麼deque是最佳之選。
三.關聯容器
1.特點
1.內部實現是採用非線性的二叉樹結構,即紅黑樹的結構原理
2.元素是有序的集合,默認在插入的時候按升序排列
2.Sets &MultiSets
1)特點
1集合(Set)是包含已排序對象的關聯容器
2多元集合(MultiSets)支持重複對象
2)語法
1.count() 返回某個值元素的個數
2.equal_range() 返回第一個>=關鍵字的迭代器和>關鍵字的迭代器
pair<iterator,iterator>equal_range(const key_type &key ); //key是用於排序的關鍵字
Set<int> ctr;
例如:
Pair<set<int>::iterator,set<int>::iterarot>p;
For(i=0;i<=5;i++) ctr.insert(i);
P=ctr.equal_range(2);
那麼*p.first==2;*p.second==3;
3.find() 返回一個指向被查找到元素的迭代器
iterator find( const key_type &key );
//查找等於key值的元素,並返回指向該元素的迭代器;
//如果沒有找到,返回指向集合最後一個元素的迭代器
3.Maps & MultiMaps
1.特點
1.Maps 關聯式容器,包含“關鍵字/值”對
2.MultiMaps 允許重複的元素
2.語法
1.count() 返回指定元素出現的次數
size_type count( const KEY_TYPE &key ); //返回map中鍵值等於key的元素的個數
2.equal_range() 返回特殊條目的迭代器對
pair equal_range( const KEY_TYPE &key );
//返回兩個迭代器,指向第一個鍵值爲key的元素和指向最後一個鍵值爲key的元素
四.容器適配器
1.特點
1.STL適配器是容器的接口,它本身不能直接保存元素,它保存元素的機制是調用另一種順序容器去實現,即“它保存一個容器,這個容器再保存所有元素”。
2.默認stack和queue基於deque容器實現;priority_queue基於vector容器實現;創建適配器時在第二個參數上指定具體的順序容器可以覆蓋適配器的默認實現。
3.stack特點是後進先出,它關聯的基本容器可以是任何一種順序容器
4.queue的特點是先進先去,適配器要求其關聯的基礎容器提供pop_front操作,因此其不能建立在vector容器上。
2.Stacks(堆棧)
1.pop() 移除棧頂元素
2.push() 在棧頂增加元素
3.size() 返回棧中元素數
3.Queues(隊列)
1..back() 返回一個引用,指向最後一個元素
2.pop() 刪除第一個元素
3.push() 在末尾加入一個元素
4.Priority Queues(優先隊列)
1.特點
類似隊列,但是元素按照一定的斷言排列有序
2.語法
1.top() 返回優先隊列中有最高優先級的元素
五.迭代器
1.解釋
迭代器是一種對象,用來遍歷STL容器中的部分或全部元素,每個迭代器對象代表容器中確定的地址。迭代器修改了常規指針的接口。迭代器是一種概念上的抽象:那些行爲上像迭代器的東西都可以叫做迭代器,迭代器可以把抽象容易和通用算法有機地結合起來。
迭代器用於遍歷複雜數據結構,其下層運行機制取決於其所遍歷的數據結構,因此,每一種容器型別都必須提供自己的迭代器,事實上每一種零七都將其迭代器以嵌套的形式定義於內部。各種迭代器接口相同,型別卻不同。即泛型程序設計的概念:所有操作行爲都使用相同的接口,雖然他們的型別不同。
2.功能特點
迭代器使開發人員不必整個實現類接口。只需提供一個迭代器,即可遍歷類中的數據結構,可被用來訪問一個容器類的所包含的全部元素。
//對vector容器對象生成和使用迭代器
vector<int>the_vector;
vector<int>::iterator the_iterator;
for(int i=0;i<10;i++)
the_vector:push_back(i);
int total=0;
the_iterator=the_vector.begin();
while(the_iterator!=the_vector.end())
{
total += *the_vector;
the_iterator++;
}
cout<<"Total="<<total<<endl;
//提示:對一個迭代器的解引用操作(*),可以訪問到容器所包含的元素
注:本文語法中只包含有易錯及難點,常見簡單的語法並未包含在內,不代表沒有。