[C++]STL-map/multimap容器

map/multimap容器

map/multimap容器相对于set的区别,map具有键值和实值,所有元素根据键值自动排序。pair的第一元素称为键值,第二元素称为实值。map也是以红黑树为底层实现机制

map的key值不可以重复,multimap的key值可以重复

#include<iostream>
#include<map>
using namespace std;

void PrintMap(map<int,int> m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		//*it取出的数据类型是pair
		cout << "key值:" << (*it).first << " value值:" << (*it).second << endl;
	}
}

//map容器初始化
void MapTest1() {
	//第一个参数为键值,第二个参数为实值
	map<int, int> map1;
	

	//插入数据   pair.first表示键值,pair.second表示实值
	//方法一
	map1.insert(pair<int, int>(1, 56));   //创建pair的匿名对象放入map1中
	//方法二
	map1.insert(make_pair(4, 888));   //调用make_pair()方法创建pair对象
	//方法三
	map1.insert(map<int,int>::value_type(2,455));   
	//方法四
	map1[9] = 233;  //类似数组方式创建

	PrintMap(map1);
}

void MapTest2() {
	//测试几种方法插入区别
	map<int, int> map1;
	/*测试方法一:方法一在插入时会返回一个pair对组,
	第一个元素是元素迭代器,第二个元素是布尔值反应插入结果*/
	pair<map<int, int>::iterator, bool> ret = map1.insert(pair<int, int>(10, 255));
	if (ret.second == false) {
		cout << "第一次插入失败!" << endl;
	}
	else {
		cout << "第一次插入成功!" << endl;
	}
	ret = map1.insert(pair<int, int>(10, 199));
	//再次插入键相同值不同的键值对,此时根据map规则应该禁止插入
	if (ret.second == false) {
		cout << "第二次插入失败!" << endl;
	}
	else {
		cout << "第二次插入成功!" << endl;
	}
	cout << "------------------------" << endl;
	//前三种方式基本都没有区别,不能向容器中写入键相同的数据

	//第四种方式
	map1[40] = 90;
	PrintMap(map1);
	map1[40] = 88; 
	cout << "------------------------" << endl;
	PrintMap(map1);
	/*
	发现key不存在,创建一个pair插入到map容器中
	如果已经存在,就修改key对应的实值
	*/


	cout << "------------------------" << endl;

	cout << "map1[60]=" << map1[60] << endl;
	
	cout << "------------------------" << endl;
	PrintMap(map1);
	//可以看出,如果通过中括号的方式访问map中一个不存在的键,
	//那么map会将访问的key插入map中,并且赋给默认值
}

//swap等函数用法与之前容器相同
int main() {
	MapTest2();

	return 0;
}

实践案例

#include<iostream>
#include<vector>
#include<map>
#include<time.h>
#include<stdlib.h>
#define SALE_DEPARTMENT 1  //销售部门
#define DEVELOP_DEPARTMENT 2   //研发部门
#define FINANCIAL_DEPARTMENT 3  // 财务部门


using namespace std;

/*
multimap案例
公司招聘5名新员工,5名员工进入公司后,需要指派员工在哪个部门工作
人员信息有:姓名 年龄 电话 工资等组成
通过multimap进行信息的插入 保存 显示
分部门显示员工信息,显示全部信息
*/

class Staff {
public:
	string mName;
	string mTele;
	int mAge;
	int mSalary;
	Staff(){};
	Staff(string name,string tele, int age,int salary):mName(name),mAge(age),mTele(tele),mSalary(salary){}
};


//创建员工对象
void CreateStaff(vector<Staff>& vStaff) {
	string seedName = "ABCDE";
	for (int i = 0; i < 5; i++) {
		Staff staff;
		staff.mName = "职员";
		staff.mName += seedName[i];
		staff.mAge = rand() % 10 + 20;
		staff.mTele = "010-88888888";
		staff.mSalary = rand() % 10000 + 10000;
		//保存员工至容器中
		vStaff.push_back(staff);
	}
}

//员工分组
void StaffByGroup(vector<Staff>& vStaff, multimap<int,Staff>& mStaff) {
	//将员工随机分配至不同的部门
	srand(time(NULL));   //添加随机数种子
	for (vector<Staff>::iterator it = vStaff.begin(); it != vStaff.end(); it++) {
		int department = rand() % 3 + 1;
		switch (department)
		{
		case SALE_DEPARTMENT:
			mStaff.insert(make_pair(SALE_DEPARTMENT, (*it)));
			break;
		case DEVELOP_DEPARTMENT:
			mStaff.insert(make_pair(DEVELOP_DEPARTMENT, (*it)));
			break;
		case FINANCIAL_DEPARTMENT:
			mStaff.insert(make_pair(FINANCIAL_DEPARTMENT, (*it)));
			break;
		default:
			break;
		}
	}
}

//定义函数,打印各个分部门信息
void PrintStaff(multimap<int, Staff>& mStaff, int departement,string departmentName) {
	multimap<int, Staff>::iterator it = mStaff.find(departement);
	int mCount = mStaff.count(departement);
	cout << "-------------------------------------------" << endl;
	cout << departmentName << endl;
	int num = 0;
	for (it; it != mStaff.end() && num < mCount; it++, num++) {
		cout << "姓名:" << ((*it).second).mName << " 年龄:" << ((*it).second).mAge << " 工资:" << ((*it).second).mSalary << " 电话:" << ((*it).second).mTele << endl;
	}
}



//打印员工信息
void PrintStaffByGroup(multimap<int,Staff>& mStaff) {
	
	//打印各个分部的员工信息
	PrintStaff(mStaff, SALE_DEPARTMENT, "销售部门员工表:");
	PrintStaff(mStaff, DEVELOP_DEPARTMENT, "研发部门员工表:");
	PrintStaff(mStaff, FINANCIAL_DEPARTMENT, "财务部门员工表:");
	
}


int main() {
	//存放新员工信息
	vector<Staff> vStaff;
	multimap<int, Staff> mStaff;
	CreateStaff(vStaff);
	StaffByGroup(vStaff, mStaff);
	PrintStaffByGroup(mStaff);
	return 0;
}

#include<iostream>
#include<vector>
#include<map>

using namespace std;


class MyKey {  //自定义键类 
public:
	int mIndex;
	MyKey(int index) :mIndex(index) {}
};



class MyComapare {  //定义排序方法 
public:
	bool operator()(MyKey key1, MyKey key2) const
	{
		return key1.mIndex < key2.mIndex;
	}
};

void PrintMap2(map<MyKey, int,MyComapare> myMap) {  //打印容器内信息
	for (map<MyKey, int>::iterator it = myMap.begin(); it != myMap.end(); it++) {
		cout << "Key : " << ((*it).first).mIndex << " value : " << (*it).second << endl;
	}
}




void MultimapTest1() {
	map<MyKey, int,MyComapare> myMap;  //自定义类,需要给出排序方式
	myMap.insert(make_pair(MyKey(15), 59));
	myMap.insert(make_pair(MyKey(45), 449));
	myMap.insert(make_pair(MyKey(4), 233));
	myMap.insert(make_pair(MyKey(1), 88));
	PrintMap2(myMap);
}

//lower_bound,upper_bound,equal_range函数用法与其他容器相同



int main() {
	MultimapTest1();
	return 0;
}

发布了18 篇原创文章 · 获赞 2 · 访问量 218

猜你喜欢

转载自blog.csdn.net/renboyu010214/article/details/104417043