1. map/multimap基本概念
Map/multimap內部是以紅黑樹爲實現機制,具有能夠自動對元素進行排序和查找效率優良的特性。所有元素都會根據元素的鍵值自動排序。Map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視爲鍵值,第二元素被視爲實值,map不允許兩個元素有相同的鍵值。Multimap和map的操作類似,唯一區別multimap鍵值可重複。
請問:我們可以通過map的迭代器改變map的鍵值嗎?答案是不行,因爲map的鍵值關係到map元素的排列規則,改變map鍵值將會破壞map組織。如果想要修改元素的實值,那麼是可以的。
Map和list擁有相同的某些性質,當對它的容器元素進行新增操作或者刪除操作時,操作之前的所有迭代器,在操作完成之後依然有效。
2. map/multimap常用API
2.1 map構造函數
map<T1, T2> mapTT;//map默認構造函數:
map(const map &mp);//拷貝構造函數
2.2 map賦值操作
map& operator=(const map &mp);//重載等號操作符
swap(mp);//交換兩個集合容器
2.3 map大小操作
size();//返回容器中元素的數目
empty();//判斷容器是否爲空
2.4 map插入數據元素操作
map.insert(...); //往容器插入元素,返回pair<iterator,bool>
map<int, string> mapStu;
// 第一種 通過pair的方式插入對象
mapStu.insert(pair<int, string>(3, "小張"));
// 第二種 通過pair的方式插入對象
mapStu.inset(make_pair(-1, "校長"));
// 第三種 通過value_type的方式插入對象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四種 通過數組的方式插入值
mapStu[3] = "小劉";
mapStu[5] = "小王";
這裏需要注意四種向map中插入元素的方式的區別,前三種其實是同一種插入方式。唯一需要說明的是第四種,map容器重載[]運算符,支持像數組一樣的下標操作。但是要注意,Map容器提供的迭代器並不是隨機訪問迭代器,也就是說迭代器不支持iter+5這種操作。
2.5 map刪除操作
clear();//刪除所有元素
erase(pos);//刪除pos迭代器所指的元素,返回下一個元素的迭代器。
erase(beg,end);//刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。
erase(keyElem);//刪除容器中key爲keyElem的對組。
2.6 map查找操作
find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key爲keyElem的對組個數。對map來說,要麼是0,要麼是1。對multimap來說,值可能大於1。
lower_bound(keyElem);//返回第一個key<=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個迭代器。
3. map中默認的排序規則
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string>
using namespace std;
//1. 默認排序規則
void test01()
{
map<int, string> m;
m.insert(map<int, string>::value_type(10, "John"));
m.insert(map<int, string>::value_type(70, "Smith"));
m.insert(map<int, string>::value_type(20, "Obama"));
m.insert(map<int, string>::value_type(50, "Polly"));
m.insert(map<int, string>::value_type(40, "Hanmeimei"));
for (auto p : m)
{
cout << "Age:" << p.first << " Name:" << p.second << endl;
}
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string>
using namespace std;
//2. 指定排序規則
struct my_compare
{
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test02()
{
map<int, string, my_compare> m;
m.insert(map<int, string>::value_type(10, "John"));
m.insert(map<int, string>::value_type(70, "Smith"));
m.insert(map<int, string>::value_type(20, "Obama"));
m.insert(map<int, string>::value_type(50, "Polly"));
m.insert(map<int, string>::value_type(40, "Hanmeimei"));
for (auto p : m)
{
cout << "Age:" << p.first << " Name:" << p.second << endl;
}
}
int main(){
test02();
system("pause");
return EXIT_SUCCESS;
}