Stl講解
1 泛型程序設計
泛型 =》通用性。
在 C++ 中,模板是泛型編程的基礎。
2體驗stl運行流程參考:stl初體驗代碼
3迭代器
1.迭代器是一種設計思想。
2.用iterator模式訪問容器內元素,可以在不暴露容器內部元素的實現的前提下訪問容器內的每個元素。
3.迭代器和指針的區別:
指針中有地址,可以打印,但迭代器中無地址,不能打印地址。
迭代器是泛化的指針,可以用++ -- * ->等運算符。
指針相減會得到一個地址,迭代器相減,得到間隔index的數量,即距離。
4.兩迭代器表示數據區間[iter1, iter2),左閉右開,算法中也是左閉右開表示,
若iter1 == iter2,區間取不到值,不操作。
5. vector<int> myvector;
vector<int>::iterator iter; //表示定義了一個用於vector<int>的迭代器。
類似於繼承關係
示例分析:
參考並練習copy.cpp
參考並練習 輸入輸出流迭代器.cpp
參考並練習 輸入輸出流迭代器2.cpp
有關transform(),容器,迭代器,函數對象,算法,negate():
copy()用法:
advance()
distance()
容器的分類與基本功能
vector<int>s1,s2; //size== 0
s1 == s2; //容器類型一致時才支持關係運算符
s1.begin()s1.end() //s.end()迭代器指最後一個元素的下一個(實際不存在)
S1.clear() //容器size變爲0
S1.empty() //返回bool型變量,若爲空,返回1
S1.size()
S1.swap(s2) //可以和空容器交換值,交換之後自身變爲空容器
(錯誤)//?????????????常迭代器:一經初始化 無法更改
正確:不可以通過常迭代器修改容器內的值,即使修改常迭代器指向的值的下一個值也不行。常迭代器的指向可以改變。(不能改變所指向的值,可以改變迭代器位置)
*(cit+1) = 99;//不可以通過常迭代器修改容器內的值;
rbegin()+1 指向倒數第二個元素。
rend()指向第一個元素的前一個(不存在)
rend()和rbegin()的返回值類型爲reverse_iterator,
不可以將rend()和rbegin()賦值給iteration。
順序容器
1 順序容器通用
n個數,t值,q迭代器(只要數據類型(比如int)相同就能使用)
//s.assign(n)=>賦值n個0
//若s中已有7,2,3,4,5; s.size() == 5
s.resize(1); //s.size() == 1, v[0] 仍== 7;
s.assign(1,9); //s.size()== 1, v[0] == 9。
//insert,挪出p1的位置插,即原來 [p1,end)開始的元素全部後移
//erase(p1) 移除p1指向的元素
返回引用,返回的不是迭代器
爲容器重新分配空間,自動初始化爲0;若空間減小了,保留前n個
2 向量vector
//vector重載了[ ], 且具有at()
//區別於resize()
即使執行s.clear(), s.capacity()也不會減小
capacity >= size
capacity雖然會自動擴容,但使用s.reserve()進行手動擴容可以避免頻繁自動擴容。
分析vector.cpp
參考示例代碼:deque
sort(iter1, iter2); //[iter1, iter2)升序排序,sort()是可變函數
//雙向非循環鏈表
List.cpp
關聯容器
關聯容器的通用操作: ( 順序容器沒有find() 和count() )
//find()只能查找key
//count()只能對key計數
>按key自動排序
最簡單的關聯容器:集合 set
分析代碼 set.cpp
//注意這邊的upper_bound(val),沒有限定範圍,一種重載。
set只有key,沒有value。
set中的元素自動按key升序排列。
pair<set<double>::iterator, bool> r;
r = s.insert(v); //s.insert(key)的返回值爲pair類型。
set中的key值要唯一。如果插入key = v成功,r.first爲指向剛插入的位置的迭代器,r.second值爲1;如果插入失敗,r.second值爲0。
分析示例代碼 map.cpp
map由key和value組成,其中的key不能重複。
map中的元素按key自動升序排列。
pair<map<double>::iterator, bool> r;
r = insert(make_pair(key,value)); //往map中要插入二元組,用make_pair()函數來構成二元組。
如果插入key = v成功,r.first爲指向剛插入的位置的迭代器,r.second值爲1;如果插入失敗,r.second值爲0。
分析代碼:muitimap.cpp
分析stl初體驗代碼
分析示例:定義普通函數表示乘法.cpp:
分析代碼 謂詞.cpp:
函數適配器
bind1st_bind2nd.cpp
分析 not1_not2_ptr_fun.cpp
成員函數適配器.cpp
Men_fun : 使成員函數作爲函數對象,傳入指針
men_fun_ref:使成員函數作爲函數對象,傳入引用
STL基本算法
參考示例:不可變算法示例分析.cpp
可變算法示例分析.cpp
可變算法示例分析2.cpp