STL:標準模板庫。包括:標準類,函數模板
六術語:
1.容器:用來存儲和組織其他對象的對象。
例如:鏈表類,又如:vector容器
優點:自動管理內存
共有六種容器:
vector , deque , list , map , set , bitset
2.容器適配器
包裝了現有STL模板,實現更加的功能
例如:queue 和 stack
3.迭代器
行爲與指針相似,類型是 容器<>::iterator
- 分爲:
輸入(只讀)輸出(只寫)迭代器,前向迭代器,雙向迭代器,隨機訪問迭代器
4.算法
函數模板,操作迭代器提供的對象
頭文件有 ,
5.函數對象
重載()運算符,實現 operator()()的函數
謂詞:返回 bool 類型值得函數。分爲兩類:單操作數 和 雙操作數
頭文件
6.函數適配器
矢量容器 使用實例:
涉及的幾個函數:
1.begin() 返回指向第一個元素的迭代器
2.end() 返回指向最後一個元素的下一個位置的迭代器
3.rbegin() 返回指向最後一個元素的迭代器,類型 reverse_iterator
4.rend() 返回指向第一個元素的下一個位置的迭代器,類型同 rbegin(),
特別注意 對象.rend()-1 指向矢量的第0號元素,
理解:將 rend 當做 begin 來理解,只是rend 指向 begin 的前一位
1: #include
2: #include
3:
4: using namespace std;;
5:
6: int main()
7: {
8: vector<int> mydata;
9: mydata.push_back(25);//在矢量尾增加一個元素,參數爲元素的值
10: cout<'/t'<//越界不檢查[1]<[0]<<
11:
12:
13: vector<int> mydata1(100);
14: cout<'/t'<'/t'<//默認初始化爲0,[100]<[99]<<[0]<<
15:
16:
17: vector<int> mydata2(10,-1);
18: cout<'/t'<'/t'<//構造時,第二個參數爲默認初始值[10]<[9]<<[0]<<
19:
20: vector<int> mydata3;
21: mydata3.reserve(10);//不初始化?使用原來內存的內容?
22: cout<[0]<
23:
24:
25: int a[]={0,1,2,3,4,5,6};
26: vector<int> mydata4(a,&a[6]);
27: //必須用兩個指針初始化矢量, 第二個參數指向要使用的最後一個元素的下一個元素,&a[6] 可以用 a+6代替
28:
29: cout<'/t'<[6]<[5]<<
30: vector<int> mydata5(mydata4.begin(),mydata4.end());//end()指向最後一個元素的下一個元素
31:
32: vector<int> mydata6(mydata4.rbegin(),mydata4.rend());
33: //rbegin將返回指向最後一個元素的迭代器,rend將返回指向第一個元素的下一個位置的迭代器,這兩種迭代器均稱爲逆向迭代器
34:
35:
36:
37: return 0;
38: }
對以上代碼的一些備註:
1.VC6.0中不進行越界檢查,但在VS2008中要進行越界檢查的,以上程序在VS2008中可以運行,但程序會崩潰
2.VS2008中編譯通過,但在VC6.0中使用 rbegin 和 rend 初始化的 mydata6 編譯不通過
3.VS2008中,未初始化的矢量也不能訪問,會報錯 “矢量下標越界”vector subscript out of range
但在VC6.0中卻可以正常訪問
reserve()函數該如何使用呢?如何進行初始化?