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\")插入成功";
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42673507/article/details/85006444