STL(Standard Template Library即,模板庫)包括六個(gè)部分:容器(containers)、迭代器(iterators)、空間配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函數(shù)(functors)

1、vector:連續(xù)存儲(chǔ)

(1)頭文件,#include<vector>

(2)創(chuàng)建vector對(duì)象,vector<int> vec;

(3)尾部插入元素,vec.push_back(a);

(4)使用下標(biāo)訪問元素,cout<<vec[0]<<endl;

(5)使用迭代訪問元素

 1 vector<int>::iterator it; 2 for(it=vec.begin();it!=vec.end();it++) 3     cout<<(*it)<<endl;

(6)插入元素,vec.insert(vec.begin()+i,a);在第i+1個(gè)元素前面插入a

(7)刪除元素,vec.erase(vec.begin()+2);刪除第3個(gè)元素

         vec.erase(vec.begin()+i,vec.end()+j);刪除區(qū)間[i,j-1];區(qū)間從0開始

(8)向量大小,vec.size();

(9)清空,vec.clear();

 vector的元素不僅僅只限于int型,int、double、string、全局結(jié)構(gòu)體等都可以。

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn) vector_sample

2、string

平時(shí)最常用的一個(gè),這里就不做過多說明了

3、map:關(guān)聯(lián)容器,提供一對(duì)一的數(shù)據(jù)映射(關(guān)鍵字,值);數(shù)據(jù)結(jié)構(gòu)為紅黑樹(RB-Tree)

  關(guān)鍵字只能在map中出現(xiàn)一次;另外,map內(nèi)部自建一顆紅黑樹(一種非嚴(yán)格意義上的平衡二叉樹),這顆樹具有對(duì)數(shù)據(jù)自動(dòng)排序的功能,所以在map內(nèi)部所有的數(shù)據(jù)都是有序的;

(1)頭文件,#include<map>;

(2)創(chuàng)建map對(duì)象,map<int,string> mapStudent;

(3)插入數(shù)據(jù),

第一種:用insert函數(shù)插入pair數(shù)據(jù)

 mapStudent.insert(pair<,>(, mapStudent.insert(pair<,>(,

第二種:用insert函數(shù)插入value_type數(shù)據(jù)

 mapStudent.insert(map<,>::value_type (, mapStudent.insert(map<,>::value_type (,

第三種:用數(shù)組方式插入數(shù)據(jù)

 1 mapStudent[1] = "Christal"; 2 mapStudent[2] = "Carl";

輸出均為:

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

  如果用前兩種方法插入數(shù)據(jù),因?yàn)殛P(guān)鍵字是唯一的,所以當(dāng)關(guān)鍵字已經(jīng)存在的時(shí)候,再插入相同關(guān)鍵字的map是不成功的;而第三種用數(shù)組插入的方法是仍然可以的,會(huì)將原來的關(guān)鍵字所對(duì)應(yīng)的值進(jìn)行更改,相當(dāng)于被覆蓋掉了。

  所以要想知道前兩種方法的插入是否成功,應(yīng)該用一個(gè)返回值來檢驗(yàn)。

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn) map_insert_check

  正如上面所說,當(dāng)要插入的關(guān)鍵字已經(jīng)存在,是插入失敗的,所以輸出結(jié)果為:

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

  而采用數(shù)組插入方式會(huì)直接覆蓋

1 mapStudent[1] = "Christal";2 mapStudent[2] = "Carl";3 mapStudent[1] = "Jerry";

  輸出結(jié)果為:

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

(4)數(shù)據(jù)的遍歷,當(dāng)然分為用迭代器遍歷的方式和用數(shù)組遍歷的方式,其中以迭代器遍歷中又分為正向遍歷和反向遍歷,正向遍歷就是我們所熟知的迭代器遍歷方式,反向遍歷如下:

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 map<,>(it=mapStudent.begin();it!=mapStudent.end();it++cout<<(*it).first<< <<(*it).second<< 4map<,>(rit=mapStudent.rbegin();rit!=mapStudent.rend();rit++cout<<(*rit).first<< <<(*rit).second<<

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

輸出結(jié)果為:

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

(5)查找數(shù)據(jù),一是用count()函數(shù)查找,存在返回1,否者返回0;二是用find()函數(shù)來定位數(shù)據(jù)出現(xiàn)的位置;

  find()函數(shù)返回一個(gè)迭代器,如果找到數(shù)據(jù),則返回?cái)?shù)據(jù)所在位置的迭代器;如果不存在,則返回值與end()函數(shù)的返回值相同;

 1 map<int,string>::iterator _iter; 2 _iter = mapStudent.find(1); 3 if(_iter != mapStudent.end()) 4     cout<<"Find Successfully"<<endl; 5 else 6     cout<<"Find Failure"<<endl;

(6)刪除數(shù)據(jù),clear()和erase()

  清空map中的所有數(shù)據(jù)用clear()函數(shù),判定map中是否有數(shù)據(jù)用empty()函數(shù),為空返回true。

  選擇性的刪除用erase()函數(shù),可以實(shí)現(xiàn)三種方式的刪除,

用迭代器刪除:

1 map<int,string>::iterator _iter;2 _iter = mapStudent.find(1);3  mapStudent.erase(_iter);

用關(guān)鍵字刪除:

1 int n = mapStudent.erase(1);2if(n == 1)3     cout<<"Erase Successfully"<<endl;4else5     cout<<"Erase Failure"<<endl;

用迭代器成片刪除,刪除區(qū)間是一個(gè)前閉后開[ )的集合:

 1 mapStudent.erase(mapStudent.begin(),mapStudent.end());

4、set:用來存儲(chǔ)同一數(shù)據(jù)類型的數(shù)據(jù),內(nèi)部每個(gè)元素都是唯一的,且自動(dòng)排序;數(shù)據(jù)結(jié)構(gòu)為紅黑樹(RB-Tree)

(1)構(gòu)造函數(shù),set<int> c;

(2)查找函數(shù),find()函數(shù)和count()函數(shù);

(3)數(shù)據(jù)訪問函數(shù),begin()、end()、rbegin()、rend();

(4)插入數(shù)據(jù),insert(element)、insert(position,element)、insert(begin,end);

(5)刪除數(shù)據(jù),erase(position)、erase(element)、erase(begin,end);

5、hash_map和hash_set:底層數(shù)據(jù)結(jié)構(gòu)是哈希表

  hash_map與map用法類似,只是內(nèi)部數(shù)據(jù)結(jié)構(gòu)不同,hash_map提供內(nèi)部數(shù)據(jù)隨機(jī)、更快的訪問;hash_set同理。

6、總結(jié):

(1)vector封裝數(shù)組,list封裝鏈表,map和set封裝了二叉樹;

(2)對(duì)于這些STL,應(yīng)當(dāng)掌握基本的插入、刪除、排序、查找等操作;

(3)對(duì)于結(jié)構(gòu)體類型的vector、map、set、hash_map、hash_set等,需要對(duì)運(yùn)算符 ‘ < ’ 進(jìn)行重載。

  例如在map中引入結(jié)構(gòu)體,對(duì) ‘ < ’ 運(yùn)算符進(jìn)行重載:

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5  6 struct Student 7 { 8     int num; 9     string name;10     Student(int nu,string na) //constructor11     {12         name = na;13         num = nu;14     }15 public:16     bool operator< (const Student& stu) const //operator the <17     {18         return stu.num<num;19     }20 };21 22 int main()23 {24     map<Student,double> mapStudent;25     //student information26     Student stu1(1,"Christal");27     Student stu2(2,"Carl");28     Student stu3(3,"Jerry");29     //insert30     mapStudent.insert(pair<Student,double>(stu1,9.9));31     mapStudent.insert(pair<Student,double>(stu2,8.8));32     mapStudent.insert(pair<Student,double>(stu3,7.7));33     //print34     map<Student,double>::iterator it;35     for(it=mapStudent.begin();it!=mapStudent.end();it++)36         cout<<(*it).first.num<<" "<<(*it).first.name<<" "<<(*it).second<<endl;37 38     return 0;39 }

http://www.cnblogs.com/Christal-R/p/7193699.html