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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL--map用法

發布時間:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL--map用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STL--map用法
map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據處理能力由于這個特性它完成有可能在我們處理一對一數據的時候,在編程上提供快速通道。這里說下map內部數據的組織map內部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對數據自動排序的功能,所以在map內部所有的數據都是有序的,后邊我們會見識到有序的好處。
下面舉例說明什么是一對一的數據映射。比如一個班級中,每個學生的學號跟他的姓名就存在著一一映射的關系,這個模型用map可能輕易描述,很明顯學號用int描述,姓名用字符串描述(本篇文章中不用char *來描述字符串,而是采用STL中string來描述),下面給出map描述代碼:
map<int, string> mymap;


1.數據的插入
(1)用insert函數插入value_type數據,下面舉例說明
#include <map>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap.insert(map<int,string>::value_type(1,"student_one"));
?????? mymap.insert(map<int,string>::value_type(2,"student_two"));
?????? mymap.insert(map<int,string>::value_type(3,"student_three"));
?????? map<int,string>::iterator it;
?????? for(it= mymap.begin();it!=mymap.end();it++)
??????? {
??????????????? cout << it->first << " " << it->second << endl;
??????? }
}

?

(2)用數組方式插入數據,下面舉例說明
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap[1]="student_one";
?????? mymap[2]="student_two";
?????? mymap[3]="student_three";
?????? map<int,string>::iterator it;
?????? for(it=mymap.begin();it!= mymap.end();it++)
??????? {
??????????? cout<<it->first<<" "<<it->second<< endl;
??????? }
}


以上兩種用法,雖然都可以實現數據的插入,但是它們是有區別的,用insert函數插入數據,在數據的插入上涉及到集合的唯一性這個概念,即當map中有這個關鍵字時,insert操作是插入數據不了的,但是用數組方式就不同了,它可以覆蓋以前該關鍵字對應的值,用程序說明
mymap.insert(map<int, string>::value_type (1, "student_one"));
mymap.insert(map<int, string>::value_type (1, "student_two"));
上面這兩條語句執行后,map中1這個關鍵字對應的值是"student_one",第二條語句并沒有生效,那么這就涉及到我們怎么知道insert語句是否插入成功的問題了,可以用pair來獲得是否插入成功,程序如下
?
pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mymap.insert(map<int, string>::value_type (1, "student_one"));
?
我們通過pair的第二個變量來知道是否插入成功,它的第一個變量返回的是一個map的迭代器,如果插入成功的話Insert_Pair.second應該是true的,否則為false。
?
下面給出完成代碼,演示插入成功與否問題
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? pair<map<int,string>::iterator,bool> Insert_pair;
?????? Insert_pair=mymap.insert(pair<int, string>(1,"student_one"));
?????? if(Insert_pair.second==true)
?????? {
?????????????? cout << "Insert Successfully" << endl;
?????? }
?????? else??? cout << "Insert Failure" << endl;
?????? Insert_pair=mymap.insert(pair<int,string>(1,"student_two"));
?????? if(Insert_pair.second == true)
?????? {
?????????????? cout << "Insert Successfully" << endl;
?????? }
?????? else??? cout << "Insert Failure" << endl;
?????? map<int,string>::iterator it;
?????? for(it = mymap.begin(); it != mymap.end(); it++)
??????? {
??????????? cout << it->first << " " << it->second << endl;
??????? }
}
運行結果:
Insert Successfully
Insert Failure
1? student_one

那么我們可以用如下程序,看下用數組插入在數據覆蓋上的效果
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap[1]= "student_one";
?????? mymap[1]= "student_two";
?????? mymap[2]= "student_three";
?????? map<int,string>::iterator it;
?????? for(it=mymap.begin();it!=mymap.end();it++)
??????? {
??????????? cout << it->first << " " << it->second << endl;
??????? }
??????? return 0;
}
運行結果:
1? student_two
2? student_three

?

2.?? map的大小
在往map里面插入了數據,我們怎么知道當前已經插入了多少數據呢,可以用size函數,用法如下:
Int nsize = mymap;.size();


3.? 數據的遍歷
這里提供三種方法,對map進行遍歷
第一種:應用前向迭代器,上面舉例程序中到處都是了,略過不表
第二種:應用反相迭代器,下面舉例說明,要體會效果,以下為運行程序
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap.insert(map<int,string>::value_type(1,"student_one"));
?????? mymap.insert(map<int,string>::value_type(2,"student_two"));
?????? mymap.insert(map<int,string>::value_type(3,"student_three"));
?????? map<int,string>::reverse_iterator it;
?????? for(it=mymap.rbegin();it!=mymap.rend();it++)
??????? {
??????????? cout << it->first << " "<< it->second << endl;
??????? }
}
運行結果:
3? student_three
2? student_two
1? student_one

第三種:用數組方式遍歷,程序說明如下
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap.insert(map<int,string>::value_type(1,"student_one"));
?????? mymap.insert(map<int,string>::value_type(2,"student_two"));
?????? mymap.insert(map<int,string>::value_type(3,"student_three"));
?????? int nsize = mymap.size();
?????? for(int i=1;i<= nsize;i++)
??????? {
??????????? cout << mymap[i] << endl;
??????? }
}
運行結果:
1? student_one
2? student_two
3? student_three

4. 數據的查找(包括判定這個關鍵字是否在map中出現)
在這里我們將體會,map在數據插入時保證有序的好處。
要判定一個數據(關鍵字)是否在map中出現的方法比較多,這里標題雖然是數據的查找,在這里將穿插著大量的map基本用法。
?
這里給出三種數據查找方法
第一種:用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置,由于map的特性,一對一的映射關系,就決定了count函數的返回值只有兩個,要么是0,要么是1,出現的情況,當然是返回1了
第二種:用find函數來定位數據出現位置,它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等于end函數返回的迭代器,程序說明:
#include <map>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap.insert(map<int,string>::value_type(1,"student_one"));
?????? mymap.insert(map<int,string>::value_type(2,"student_two"));
?????? mymap.insert(map<int,string>::value_type(3,"student_three"));
?????? map<int,string>::iterator it;
?????? it=mymap.find(1);
?????? if(it!= mymap.end())
??????? {
?????? cout<< "Find, the value is " << it->second << endl;
??????? }
??????? else
??????? {
??????????? cout << "Do not Find" << endl;
??????? }
}
運行結果:
Find, the value is? student_one

第三種:這個方法用來判定數據是否出現,是顯得笨了點,但是,我打算在這里講解
Lower_bound函數用法,這個函數用來返回要查找關鍵字的下界(是一個迭代器)
Upper_bound函數用法,這個函數用來返回要查找關鍵字的上界(是一個迭代器)
例如:map中已經插入了1,2,3,4的話,如果lower_bound(2)的話,返回的2,而upper-bound(2)的話,返回的就是3
Equal_range函數返回一個pair,pair里面第一個變量是Lower_bound返回的迭代器,pair里面第二個迭代器是Upper_bound返回的迭代器,如果這兩個迭代器相等的話,則說明map中不出現這個關鍵字
(這個暫時還沒弄清楚。。。。。)


5.? 數據的清空與判空
清空map中的數據可以用clear()函數,判定map中是否有數據可以用empty()函數,它返回true則說明是空map


6.? 數據的刪除
這里要用到erase函數,它有三個重載了的函數,下面在例子中詳細說明它們的用法
#include <map>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
?????? map<int,string> mymap;
?????? mymap.insert(map<int,string>::value_type(1,"student_one"));
?????? mymap.insert(map<int,string>::value_type(2,"student_two"));
?????? mymap.insert(map<int,string>::value_type(3,"student_three"));
//如果你要演示輸出效果,請選擇以下的一種,你看到的效果會比較好
?
?????? //如果要刪除1,用迭代器刪除
?????? map<int, string>::iterator it;
?????? it = mymap.find(1);
?????? mymap.erase(iter);
?
?
?????? //如果要刪除1,用關鍵字刪除
?????? int n = mymap.erase(1);//如果刪除了會返回1,否則返回0
?
?
?????? //用迭代器,成片的刪除
?????? //一下代碼把整個map清空
?????? mymap.earse(mymap.begin(), mymap.end());
?????? //成片刪除要注意的是,也是STL的特性,刪除區間是一個前閉后開的集合
}


其余的STL—map功能暫不研究。

轉載于:https://www.cnblogs.com/ct0421/p/3718673.html

總結

以上是生活随笔為你收集整理的STL--map用法的全部內容,希望文章能夠幫你解決所遇到的問題。

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