1. 程式人生 > >map關聯容器的基本操作

map關聯容器的基本操作

map<key,value>儲存的一對pair ,其內部通過紅黑樹實現,查詢效率非常高,使用者插入資料後,系統會自動根據key值大小進行排序,當然,一些自定義的類需要自定義比較函式,例如仿函式,過載< , >操作符等。

//簡單map容器初始化
void test02() {
	//map儲存的是一個pair
	map<int, string>MyMap;
	MyMap.insert(make_pair(1, "c++"));
	MyMap.insert(pair<int, string>(2, "python"));
	MyMap.insert(map<int, string>::value_type(3, "fortran"));
	//以上三種沒有區別,若再插入的pair中的key值與之前重複,則插入失敗,否則插入成功
	MyMap[4] = "java";//[]裡放key值 ,該方法插入時若map中存在相同key值,則替換value值,否則直接插入
	//迭代器進行遍歷
	for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) {
		//it是指向pair的指標 it->first是key值 second是value值
		cout << "key:" << it->first << "   value:" << (*it).second << endl;
	}
//-----------------------------------------------------------------
//看看Mymap[] 和MyMap.insert的區別
	MyMap.insert(make_pair(1, "c"));
	cout << "--------------------------------------------------------"<<endl;
	cout << "插入make_pair(1, \"c\")後的遍歷結果:" << endl;
	for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) {
		//it是指向pair的指標 it->first是key值 second是value值
		cout << "key:" << it->first << "   value:" << (*it).second << endl;
	}
	MyMap[1] = "c";
	cout << "--------------------------------------------------------"<<endl;
	cout<< "MyMap[1] = \"c\"後的遍歷結果:" << endl;
	for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) {
		//it是指向pair的指標 it->first是key值 second是value值
		cout << "key:" << it->first << "   value:" << (*it).second << endl;
	}
}

在這裡插入圖片描述

//map的查詢
void test03() {
	map<int, string>Map1;//map<key,value>
	Map1.insert(make_pair(1, "anhui"));
	Map1.insert(make_pair(2, "beijing"));
	Map1.insert(make_pair(3, "shanghai"));
	int j = Map1.count(1);//find引數是key值 返回key值是1的個數
	int i = Map1.count(4);
	for (map<int, string>::iterator it = Map1.begin(); it != Map1.end(); it++) {
		cout << "key:" << it->first << "   value:" << it->second << endl;
	}
	cout << "key=1的資料有" << j << "個" << endl;
	cout << "key=4的資料有" << i << "個" << endl;
	map<int, string>::iterator ptr = Map1.find(2);//find返回迭代器
	if (ptr == Map1.end())
		cout << "找不到key=2的值" << endl;
	else
		cout << "key=2的值的value為" << ptr->second << endl;
	ptr = Map1.find(5);
	if (ptr == Map1.end())
		cout << "找不到key=5的值" << endl;
	else
		cout << "key=5的值的value為" << ptr->second << endl;
}

在這裡插入圖片描述

//map儲存自定義的類
class Person{
public:
	Person(int age, char gender, string name) :m_age(age), m_gender(gender), m_name(name) {};
	friend bool operator <(const Person& p1, const Person& p2) {
		return p1.m_age < p2.m_age;
	}
	friend ostream& operator<< (ostream& os, const Person& p) { 
		os << "age:" << p.m_age << "  gender:" << p.m_gender << "   name" << p.m_name ;
		return os;
	}
private:
	int m_age;
	char m_gender;
	string m_name;
};
void test04() {
	map<Person, string>m_map;
	Person p1(15, 'b', "jack");
	Person p2(19, 'g', "mike");
	Person p3(20, 'g', "lucy");
	Person p4(28, 'b', "joshon");
	m_map[p1] = "CHN";
	m_map[p2] = "JAPAN";
	m_map[p3] = "CANADA";
	m_map.insert(make_pair(p4, "KOREAN"));
	for (map<Person, string>::iterator it = m_map.begin(); it != m_map.end(); it++) {
		cout << "PERSION   " << it->first << "  REGION   " << it->second<<endl;
	}
	//執行m_map.insert()的返回值 返回一個pair,  pair.first 是與當前map型別一致,pair.second是bool值 ,插入成功是true ,否則false
	pair < map<Person, string>::iterator, bool > ptr = m_map.insert(make_pair(p2, "CHN"));
	if (ptr.second == false)
		cout << "make_pair(p2, \"CHN\")插入失敗";
	else
		cout << "make_pair(p2, \"CHN\")插入成功";
}

在這裡插入圖片描述