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)體等都可以。
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";
輸出均為:
如果用前兩種方法插入數(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)。
map_insert_check
正如上面所說,當(dāng)要插入的關(guān)鍵字已經(jīng)存在,是插入失敗的,所以輸出結(jié)果為:
而采用數(shù)組插入方式會(huì)直接覆蓋
1 mapStudent[1] = "Christal";2 mapStudent[2] = "Carl";3 mapStudent[1] = "Jerry";
輸出結(jié)果為:
(4)數(shù)據(jù)的遍歷,當(dāng)然分為用迭代器遍歷的方式和用數(shù)組遍歷的方式,其中以迭代器遍歷中又分為正向遍歷和反向遍歷,正向遍歷就是我們所熟知的迭代器遍歷方式,反向遍歷如下:
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<<
輸出結(jié)果為:
(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)行重載:
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