map基本概念
簡介:
-
map中所有元素都是pair
-
pair中第一個元素為key(鍵值),起到索引作用,第二個元素為value(實值)
-
所有元素都會根據元素的鍵值自動排序
本質:
-
map/multimap屬于關聯式容器,底層結構是用二叉樹實現
優點:
-
可以根據key值快速找到value值
map和multimap區別:
-
map不允許容器中有重復key值元素
-
multimap允許容器中有重復key值元素
map構造和賦值
功能描述:
-
對map容器進行構造和賦值操作
函數原型:
-
map<T1 T2> mp; //map默認構造函數
-
map(const map &mp); //拷貝構造函數
賦值:
-
map& operator=(const map &mp); //重載等號操作符
map大小和交換
功能描述:
-
統計map容器大小以及交換map容器
函數原型:
-
size(); //返回容器中元素的數目
-
empty(); //判斷容器是否為空
-
swap(st); //交換兩個集合容器
map插入和刪除
功能描述:
-
map容器進行插入數據和刪除數據
函數原型:
-
insert(elem);
// 在容器中插入元素。
//四種插入方法
map<int,int>m;
//第一種
m.insert(pair<int,int>(1,10));
//第二種
m.insert(make_pair(2,20));
//第三種
m.insert(map<int,int>::value_type(3,30));
//第四種,不建議使用[]插入,但可以使用[]訪問
//當錯誤的使用 [] 賦值時,會在map中額外的插入一個元素
m[4] = 40;
-
clear();
// 清除所有元素 -
erase(pos);
// 刪除pos迭代器所指的元素,返回下一個元素的迭代器。 -
erase(beg, end);
// 刪除區間[beg, end)的所有元素,返回下一個元素的迭代器。 -
erase(key);
// 刪除容器中值為key的元素。
map查找和統計
功能描述:
-
對map容器進行查找數據以及統計數據
函數原型:
-
find(key);
// 查找key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end(); -
count(key);
// 統計key的元素個數
-
查找 --- find (返回的是迭代器)
-
統計 --- count (對于map,結果為0或者1)
map容器排序
-
map容器默認排序規則為按照key值進行從小到大排序
主要技術點:
-
利用仿函數可以指定map容器的排序規則
-
對于自定義數據類型,map必須要指定排序規則,同set容器
內置數據類型定義仿函數調整map排序方法
#include<iostream>
#include<string>
#include<map>
using namespace std;class myCompare{
public://定義仿函數bool operator()(int a, int b)const{return a > b;}
};
int main(){map<int,string> m1;m1.insert(pair<int,string>(10,"a"));m1.insert(pair<int,string>(20,"b"));m1.insert(pair<int,string>(30,"c"));m1.insert(pair<int,string>(40,"d"));for(map<int,string>::iterator it = m1.begin(); it != m1.end(); it++){cout << it->first << " " << it ->second << endl; }cout << "--------------------------------" << endl;map<int,string,myCompare> m2;m2.insert(pair<int,string>(10,"a"));m2.insert(pair<int,string>(20,"b"));m2.insert(pair<int,string>(30,"c"));m2.insert(pair<int,string>(40,"d"));for(map<int,string,myCompare>::iterator it = m2.begin(); it != m2.end(); it++){cout << it->first << " " << it ->second << endl; }
}
?輸出結果如下:
自定義數據類型定義仿函數調整map排序方法
如果不定義仿函數,則無法直接按鍵插入自定義數據類型
#include<iostream>
#include<set>
#include<iostream>
#include<string>
#include<map>
using namespace std;class Person{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};class comparePerson{
public:// 定義仿函數bool operator()(const Person&p1,const Person&p2)const{return p1.m_Age > p2.m_Age;}
};int main(){Person p1("張三",20);Person p2("李四",21);Person p3("王五",22);Person p4("趙六",23);map<Person,string,comparePerson> m1;m1.insert(pair<Person,string>(p1,"a"));m1.insert(pair<Person,string>(p2,"b"));m1.insert(pair<Person,string>(p3,"c"));m1.insert(pair<Person,string>(p4,"d"));for(map<Person,string,comparePerson>::iterator it = m1.begin(); it != m1.end(); it++){cout << " 姓名:" << it->first.m_Name << " 年齡:" << it->first.m_Age << " 等級:" << it ->second << endl; }}
輸出結果如下:?