STL-map和multimap容器

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這種操作。
通過下標操作,下標中的元素爲map的中的key,等號後面的是value. 插入元素當key存在的時候會修改key所對應的值,其他三種方式插入的時候,如果key存在會插入失敗。如果key不存在,那麼會插入新元素。還有一點需要大家注意的,當我們直接cout << mapStu['不存在的key'] << endl; 那麼程序並不會報錯,Map默認會以這個key和一個默認值作爲一個新的元素插入到map中。

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中默認的排序規則

map容器中默認是根據map的key進行升序排列。
#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;
}



默認根據key從小到大排序。 我們現在希望結果從大到小排序:
#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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章