map相关操作
? ? ? ? ? ?由于工作中經常用到map來進行數據保存和數據遍歷,這里來總結一下,先看看C++ Primer這么描述的。map屬于關聯容器,定義了一個關聯數組,類似vector,map是一個類模板。但是一個map要用兩個類型來定義:關鍵字的類型和關鍵值的類型。在一個map中,一個給定關鍵字只能出現一次,每個關鍵字關聯一個特定的值。解引用一個map迭代器會生成一個pair,它保存一個const關鍵字及其關聯的值。話不多說,看代碼,為了簡潔,我省略了頭文件。
1.map的遍歷
?
int main() {map<string,int> word={{"a",1},{"b",2}};map<string,int>::iterator IT;for(IT=word.begin();IT!=word.end();IT++){cout<<IT->first<<','<<IT->second<<endl;}return 0; }打印:a,1
?
? ? ? ? ? ? b,2
2.map的插入操作(insert)。insert函數操作的返回值是一個pair,其first成員是一個迭代器,指向具有給定關鍵字的元素,second的成員是一個bool值
?
int main() {map<string,int> word;pair<map<string,int>::iterator,bool> ret;//定義insert的返回值ret=word.insert(pair<string,int>("a",1));if(ret.second){cout<<"yes"<<endl;cout<<ret.first->second<<endl;}return 0; }打印:yes
?
? ? ? ? ? ? 1
3.map的刪除操作(erase)
?
int main() {map<string,int>word={{"a",1},{"b",2},{"c",3}};int num=word.erase("a")//利用關鍵字刪除,返回刪除元素的數量。雞肋cout<<num<<endl;map<string,int>::iterator IT=word.begin();//注意這里IT重新賦值,因為前面刪除過一個迭代器,指向不明確了map<string,int>::iterator IT1;IT1=word.erase(IT);//word.erase.(IT++) 這樣。返回的迭代器仍指向下一個迭代器cout<<IT1->first<<','<<IT1->second<<endl;IT=word.begin();IT1=word.end();word.erase(IT,IT1);//根據范圍迭代器進行刪除,返回IT1return 0; }打印:1
?
? ? ? ? ? ? b,2
IT++是自加操作,將IT指向下一個地址并且返回IT原來的副本。參數的處理優先于函數的調用。不信看
?
void func(map<string,int>::iterator it) {cout<<it->first<<','<<it->second<<endl; }int main() {map<string,int>word={{"a",1},{"b",2}};map<string,int>::iterator IT=word.begin();func(IT++);cout<<IT->first<<','<<IT->second<<endl;return 0; }打印:a,1
?
? ? ? ? ? ? b,2
?
4.map中元素的查找(find),返回一個迭代器,指向第一個關鍵字為key的元素,沒找到則返回map的尾部迭代器
?
int main() {map<string,int>word={{"a",1}};map<string,int>::iterator IT;IT=word.find("a");cout<<IT->first<<','<<IT->second<<endl;return 0; }打印:a,1
?
?map還有clear(),count(),empty(),size(),swap()等函數
平常學習中,map中對應的關鍵值只存放一個元素。實際工作中需要存放多個元素,此時關鍵值變為結構體了。
struct Node {int data;int data1; };int main() {map<int,Node> Map;//struct標識不需要寫進去Map.insert(pair<int,Node>(1,{2,3}));map<int,Node>::iterator it=Map.begin();cout<<it->second.data<<','<<it->second.data1<<endl;return 0; }打印:2,3
?
?
?
?
?
?
?
?
?
總結
- 上一篇: sscanf简单用法
- 下一篇: sprintf,sscanf,snpri