STL_導圖(C++)

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)=>賦值n0

 //s中已有72345 s.size() == 5

s.resize(1);      //s.size() == 1, v[0] == 7

       s.assign(1,9); //s.size()== 1, v[0] == 9

//insert,挪出p1的位置插,即原來 [p1end)開始的元素全部後移

//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

 

 

mapkeyvalue組成,其中的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

 

 

 

發佈了54 篇原創文章 · 獲贊 58 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章