STL常用对象,不会搞得C++跟没学一样
一、map/multimap
map/multimap映射容器的元素數據是由一個Key和一個Value成的,key與映照value之間具有一一映照的關系。
map/multimap容器的數據結構也采用紅黑樹來實現的,map插入元素的鍵值不允許重復,類似multiset,multimap的key可以重復。比較函數只對元素的key進行比較,元素的各項數據只能通過key檢索出來。雖然map與set采用的都是紅黑樹的結構,但跟set的區別主要是set的一個鍵值和一個映射數據相等,Key=Value。
map/multimap用法
頭文件
map成員函數
begin() //返回指向 map 頭部的迭代器 clear() // 刪除所有元素 count() //返回指定元素出現的次數 empty() // 如果 map 為空則返回 true end() //返回指向 map 末尾的迭代器 erase() // 刪除一個元素 find() // 查找一個元素 insert() //插入元素 key_comp() //返回比較元素 key 的函數 lower_bound() //返回鍵值>=給定元素的第一個位置 max_size() //返回可以容納的最大元素個數 rbegin() //返回一個指向 map 尾部的逆向迭代器 rend() //返回一個指向 map 頭部的逆向迭代器 size() //返回 map 中元素的個數 swap() //交換兩個 map upper_bound() //返回鍵值>給定元素的第一個位置 value_comp() //返回比較元素 value 的函數創建map對象
#include<iostream> #include<map> using namespace std; map<int,char>mp;//定義map容器創建結構體map對象
struct student{ int birth; string name; }; int id; typedef map<int,student> Student;// 這里相當于給map<int,student> 起了個別名Student,后續代碼均可以用student代替map<int,student> 使用。插入結構體對象
接上文代碼
通過map容器使得上述解題方式更簡便。
二、棧(stack)
1.定義:
棧是一種只能在某一端插入和刪除數據的特殊線性表。他按照先進先出的原則存儲數據,先進的數據被壓入棧底,最后進入的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后被壓入棧的,最先彈出)。因此棧也稱先進后出表。
允許進行插入刪除操作的一端稱為棧頂,另一端稱為棧底。棧底固定,棧頂浮動。插入元素稱為進棧,刪除一個元素稱為進棧,棧內元素為零稱為空棧。
2.stack成員函數
三、向量(vector)
它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮數據。vector在C++標準模板庫中的部分內容,它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。
使用vector需要注意以下幾點:
1、當vector、string大量插入數據后,即使刪除了大量數據(或者全部都刪除,即clear) 并沒有改變容器的容量(capacity),所以仍然會占用著內存。 為了避免這種情況,我們應該想辦法改變容器的容量使之盡可能小的符合當前 數據所需(shrink to fit)。
vector<type> vec={1,2,3,4.......................}; vector<type>(v).swap(v); //此時v的容量已經盡可能的符合其當前包含的元素數量 //對于string則可能像下面這樣 string(s).swap(s);// 即執行交換后,臨時變量會被銷毀,內存得到釋放。(1)頭文件
#include<vector>(2)創建vector對象,vector< int > vec;
(3)尾部插入數字:vec.push_back(a);
(4)使用下標訪問元素,cout<<vec[0]<<endl;記住下標是從0開始的。
(5)使用迭代器訪問元素.
vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
(7)刪除元素:
vector.erase(vec.begin()+2);刪除第3個元素vector.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j);區間從0開始(8)向量大小:vector.size();
(9)清空:vec.clear();
ps:
resize(),設置大小(size); reserve(),設置容量(capacity); size()是分配容器的內存大小,而capacity()只是設置容器容量大小,但并沒有真正分配內存。 打個比方:買了一個新房子,新房子里可以放3張床reserve(3),這是說房子的容量是最多放3張床,但是屋里并不是有三張床,二resize(3),房里安裝了3張床,此時房里的床可以使用了。
reserve為容器預留足夠的空間,避免不必要的重復分配,分配空間大于等于函數的參數,影響capacity。
resize調整容器中有效數據區域的尺寸,如果尺寸變小,原來數據多余的截掉。若尺寸變大,不夠的數據用該函數第二個參數填充,影響size。
由于vector是順序容器,在內存中分配了一塊連續的存儲空間。為了保證動態添加元素的高效率,因此必須預先為vector分配一段空間,這個空間就是capacity。
而容器中元素的個數就是size(),在容器中,capacity總是大于等于 size;
四、隊列
queue是隊列容器,是一種“先進先出”的容器。
頭文件
queue對象的默認構造形式:queue name; 如:
queue<int> name; //一個存放int的queue容器。queue<float> name; //一個存放float的queue容器。queue<string> name; //一個存放string的queue容器。 //尖括號內還可以設置指針類型或自定義類型。queue的成員函數
queue.push(elem); //往隊尾添加元素queue.pop(); //從隊頭移除第一個元素queue(const queue &que); //拷貝構造函數queue& operator=(const queue &que); //重載等號操作符queue.back(); //返回最后一個元素queue.front(); //返回第一個元素queue.empty(); //判斷隊列是否為空queue.size(); //返回隊列的大小五、set集合
set/multiset 與map類的區別是set 的key=value。其余跟map類的可以類比。set容器因為key等于value所以按照值排序,由小到大。
set的各成員函數列表如下:
set由大到小排序set<int,greater < int > > M;
七、迭代器
vector< int >::iterator name 容器類型< type> ::iterator name是一類類似指針的,與指針的區別,map set成員的迭代器不能加減一個整數,只能自增或自減運算。但是vector的可以。
雙向迭代器(map multimap set multiset)
組合正向迭代器和逆向迭代器的功能,支持多遍算法
隨機訪問迭代器(vector deque)
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向后跳過任意個元素。即可以加減一個常數。
小白創作,還親各位大佬指點,萬分感謝!
總結
以上是生活随笔為你收集整理的STL常用对象,不会搞得C++跟没学一样的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数制转换itoa atoi int转字
- 下一篇: win10错误577怎么办 win10错