STL初步讲解
文章目錄
- sort
- map
- vector
- stack
- queue
- priority_queue
初學C++,發現經常在文件中有using namespace std這個東西。
首先 namespace 這個東西叫做命名空間。using有好幾種用法,這里使用的是using的命名空間的使用。
std是C++中的一個命名空間,叫做標準命名空間。C++標準庫中的函數或者對象都是在命名空間std中定義的,
所以我們要使用標準函數庫中的函數或對象都要使用std來限定。通俗的講就是說 我們平常用的標準庫中的cout,cin其實都是
sort
語法
sort(start,end,cmp)
(1) start表示要排序數組的起始地址;
(2) end表示數組結束地址的下一位;
(3) cmp用于規定排序的方法,可不填,默認升序。
[start,end)
less< int >()為升序,greater< int >()為降序
平均時間復雜度為O(nlogn)
map
map是STL的一個關聯容器,它提供一對一的hash。
第一個可以稱為關鍵字(key),每個關鍵字只能在map中出現一次;
第二個可能稱為該關鍵字的值(value);
2,map的功能
自動建立key - value的對應。key 和 value可以是任意你需要的類型,包括自定義類型。
// 定義一個map對象 map<int, string> mapStudent;// 第一種 用insert函數插入pair mapStudent.insert(pair<int, string>(000, "student_zero"));// 第二種 用"array"方式插入 mapStudent[123] = "student_first"; mapStudent[456] = "student_second"; //迭代器刪除 map<int, string>::iterator iter; iter = mapStudent.find("123"); mapStudent.erase(iter);//用關鍵字刪除 int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0//用迭代器范圍刪除 : 把整個map清空 mapStudent.erase(mapStudent.begin(), mapStudent.end()); //等同于mapStudent.clear()map的遍歷
#include<iostream> #include<map> using namespace std; int main(){map <int ,string> mp;mp.insert(pair<int,string>(1,"a"));mp.insert(pair<int,string>(2,"b"));mp[2]="c";mp[4]="d";//創建對應類型的迭代器map<int, string>::iterator iter; //調用map中的begin()和end()函數,使得迭代器指針能夠遍歷整個map容器for(iter = mp.begin(); iter != mp.end(); iter++) //其中iter->frist為map中的key,iter->second為map中的valuecout<<iter->first<<' '<<iter->second<<endl; return 0; }map中數據的查找
用find函數來定位數據出現位置,它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等于end函數返回的迭代器。
基本操作函數
9,map的基本操作函數:C++ maps是一種關聯式容器,包含“關鍵字/值”對begin() 返回指向map頭部的迭代器clear() 刪除所有元素count() 該數據是否存在,存在返回1,不存在返回0empty() 如果map為空則返回trueend() 返回指向map末尾的迭代器equal_range() 返回特殊條目的迭代器對erase() 刪除一個元素find() 查找一個元素get_allocator() 返回map的配置器insert() 插入元素key_comp() 返回比較元素key的函數lower_bound() 返回鍵值>=給定元素的第一個位置max_size() 返回可以容納的最大元素個數rbegin() 返回一個指向map尾部的逆向迭代器rend() 返回一個指向map頭部的逆向迭代器size() 返回map中元素的個數swap() 交換兩個mapupper_bound() 返回鍵值>給定元素的第一個位置value_comp() 返回比較元素value的函數vector
在c++中,vector是一個十分有用的容器。
作用:它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮數據。
vector在C++標準模板庫中的部分內容,它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。
使用方法:
1 、基本操作
(1)頭文件#include.
(2)創建vector對象,vector vec;
(3)尾部插入數字:vec.push_back(a);
(4)使用下標訪問元素,cout<<vec[0]<<endl;記住下標是從0開始的。
(5)使用迭代器訪問元素.
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
(7)刪除元素: vec.erase(vec.begin()+2);刪除第3個元素
vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始
(8)向量大小:vec.size();
(9)清空:vec.clear();
四、幾種重要的算法,使用時需要包含頭文件:
#include
(1)sort(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素進行從小到大排列
(2)reverse(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素為1,3,2,4,倒置后為4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的從a.begin()(包括它)到a.end()(不包括它)的元素復制到b中,從b.begin()+1的位置(包括它)開 始復制,覆蓋掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的從a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
二維vector
vector < vector > a; // a是向量類型的向量
stack
先進后出(FILO)的數據結構。
c++ stl棧stack的頭文件為:
#include
c++ stl棧stack的成員函數介紹
操作 比較和分配堆棧
empty() 堆棧為空則返回真
pop() 移除棧頂元素
push() 在棧頂增加元素
size() 返回棧中元素數目
top() 返回棧頂元素
queue
一.queue模版類的定義在頭文件中。
queue與stack模版非常類似,queue模版也需要定義兩個模版參數,一個是元素類型,一個是容器類型,元素類型是必要的,容器類型是可選的,默認為dqueue類型。
定義queue對象的示例代碼如下:
queueq1;
queueq2;
queue的基本操作有:
1.入隊:如q.push(x):將x元素接到隊列的末端;
2.出隊:如q.pop() 彈出隊列的第一個元素,并不會返回元素的值;
3,訪問隊首元素:如q.front()
4,訪問隊尾元素,如q.back();
5,訪問隊中的元素個數,如q.size();
priority_queue
用法:#include
定義:priority_queue q;(隊頭最大)
priority_queue<int,vector,greater > q; (隊頭最小)
也可以對struct使用,重載struct的<即可。
功能:
函數 功能
q.top() 隊頭
q.pop() 彈出隊頭
q.push() 加入隊列
q.empty() 是否為空
priority_queue<int ,vector,cmp>pq
struct cmp{bool operator()(const int a,const int b)const{retrun a>b;//這里是實現一個“個位數大的整數優先級小”的優先隊列} };總結
- 上一篇: 书论59 项穆《书法雅言》
- 下一篇: html5在线俄罗斯方块,HTML5最新