日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

STL常用对象,不会搞得C++跟没学一样

發布時間:2023/12/15 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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<first,second> a; //map,會按照first(鍵值)排序(查找也是);

map/multimap用法
頭文件

#include< map >

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> 使用。

插入結構體對象
接上文代碼

Stduent a; cin>>id>>student.birth>>student.name; a.insert(make_pair(id,student));

通過map容器使得上述解題方式更簡便。

二、棧(stack)

1.定義:
棧是一種只能在某一端插入和刪除數據的特殊線性表。他按照先進先出的原則存儲數據,先進的數據被壓入棧底,最后進入的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后被壓入棧的,最先彈出)。因此棧也稱先進后出表。
允許進行插入刪除操作的一端稱為棧頂,另一端稱為棧底。棧底固定,棧頂浮動。插入元素稱為進棧,刪除一個元素稱為進棧,棧內元素為零稱為空棧。
2.stack成員函數

bool empty ( ) ————>棧為空返回true,否則返回false; void pop ( ) ————>刪除棧頂元素,出棧; void push(const TYPE&value)————> 插入新元素value,放置在棧頂進棧;TYPE:類型int,char…; size_type size ( ) ————> 返回堆棧中元素個數;(注意注意!!!!切不可賦值給int ,很容易超過int的范圍 TYPE&top()————> 查看當前棧頂元素;

三、向量(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是隊列容器,是一種“先進先出”的容器。
頭文件

#include <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.begin()--返回指向第一個元素的迭代器set.clear()--清除所有元素 set.count()--返回某個值元素的個數 set.empty()--如果集合為空,返回true set.end()--返回指向最后一個元素的迭代器 set.equal_range()--返回集合中與給定值相等的上下限的兩個迭代器 set.erase()--刪除集合中的元素 set.find()--返回一個指向被查找到元素的迭代器 set.get_allocator()--返回集合的分配器 set.insert()--在集合中插入元素 set.lower_bound()--返回指向大于(或等于)某值的第一個元素的迭代器 set.key_comp()--返回一個用于元素間值比較的函數 set.max_size()--返回集合能容納的元素的最大限值 set.rbegin()--返回指向集合中最后一個元素的反向迭代器 set.rend()--返回指向集合中第一個元素的反向迭代器 set.size()--集合中元素的數目 set.swap()--交換兩個集合變量 set.upper_bound()--返回大于某個值元素的迭代器 set.value_comp()--返回一個用于比較元素間的值的函數

set由大到小排序set<int,greater < int > > M;

七、迭代器

vector< int >::iterator name 容器類型< type> ::iterator name

是一類類似指針的,與指針的區別,map set成員的迭代器不能加減一個整數,只能自增或自減運算。但是vector的可以。
雙向迭代器(map multimap set multiset)
組合正向迭代器和逆向迭代器的功能,支持多遍算法
隨機訪問迭代器(vector deque)
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向后跳過任意個元素。即可以加減一個常數。

小白創作,還親各位大佬指點,萬分感謝!

總結

以上是生活随笔為你收集整理的STL常用对象,不会搞得C++跟没学一样的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。