map/multimap容器

9. map/multimap容器

9.1 map基本概念

简介:

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的值自动排序

本质:

  • map/multimap属于关联式容器,底层结构是用二叉树实现。

优点:

  • 可以根据key值快速找到value值
    map和multimap区别:
  • map不允许容器中有重复的 key值元素
  • multimap允许容器中有重复的key值元素

9.2 map构造和赋值

功能描述:

  • 对map容器进行构造和赋值操作
    函数原型:
    构造:
  • map<T1,T2>mp;//map默认构造函数
  • map(const map &mp);//拷贝构造函数
    赋值:
  • map& operator=(const map &mp);//重载等号操作符

示例:

#include<iostream>
using namespace std;
#include<map>
//map构造和赋值
void printMap(map<int, int>& m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key= " << (*it).first << " value= " << it->second << endl;
	}
}
void test01()
{
	map<int, int>m;//创建map容器
	//插入的是对组
	m.insert(pair<int, int>(2, 20));
	m.insert(pair<int, int>(5, 50));
	m.insert(pair<int, int>(4, 40));
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(3, 30));
	cout << "m=" << endl;
	printMap(m);//打印输出
	//拷贝构造
	map<int, int>m2(m);
	cout << "m2=" << endl;
	printMap(m2);
	//赋值
	map<int, int>m3;
	m3 = m2;
	cout << "m3=" << endl;
	printMap(m3);
}
int main()
{
	test01();
	system("pause");
	return 0;
}

运行结果:

m=
key= 1 value= 10
key= 2 value= 20
key= 3 value= 30
key= 4 value= 40
key= 5 value= 50
m2=
key= 1 value= 10
key= 2 value= 20
key= 3 value= 30
key= 4 value= 40
key= 5 value= 50
m3=
key= 1 value= 10
key= 2 value= 20
key= 3 value= 30
key= 4 value= 40
key= 5 value= 50
请按任意键继续. . .

总结:map中所有元素都是成对出现的,插入数据时候要使用对组


9.3 map大小和交换

功能描述:

  • 统计map容器大小以及交换map容器
    函数原型:
  • size();
  • empty();
  • swap(st);

示例:

#include<iostream>
using namespace std;
#include<map>
///map大小和交换
void printMap(map<int, int>& m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout <<"key=:"<< (*it).first << " " << " value=:"<<it->second << endl;
	}
}
void test01()
{
	map<int, int>m1;
	m1.insert(pair<int, int>(1, 10));
	m1.insert(pair<int, int>(2, 20));
	m1.insert(pair<int, int>(3, 30));
	if (m1.empty())
	{
		cout << "m1为空" << endl;
	}
	else
	{
		cout << "m1不为空,大小为:";
		cout << m1.size() << endl;
	}
	map<int, int>m2;
	m2.insert(pair<int, int>(4,40));
	m2.insert(pair<int, int>(5, 50));
	m2.insert(pair<int, int>(6, 60));
	cout << "交换前:" << endl;
	printMap(m1);
	cout << endl;
	printMap(m2);
	cout << "交换后:" << endl;
	m1.swap(m2);
	printMap(m1);
	cout << endl;
	printMap(m2);

}
int main()
{
	test01();
	system("pause");
	return 0;
}

运行结果:

m1不为空,大小为:3
交换前:
key=:1  value=:10
key=:2  value=:20
key=:3  value=:30

key=:4  value=:40
key=:5  value=:50
key=:6  value=:60
交换后:
key=:4  value=:40
key=:5  value=:50
key=:6  value=:60

key=:1  value=:10
key=:2  value=:20
key=:3  value=:30
请按任意键继续. . .

9.4 map插入和删除

功能描述:

  • map容器进行插入数据和删除数据

函数原型:

  • insert(elem);
  • clear();//
  • erase(pos);
  • erase(beg,end);
  • erase(key);
    示例:
#include<iostream>
using namespace std;
#include<map>
//map插入和删除
void printMap(map<int, int>& m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key=" << (*it).first << " value=" << it->second << endl;
	}
}
void test01()
{
	map<int, int>m1;
	//插入,第一种
	m1.insert(pair<int, int>(1, 10));
	//第二种
	m1.insert(make_pair(2, 20));
	//第三种
	m1.insert(map<int, int>::value_type(3, 30));
	//第四种 []不建议插入,用途:可以利用key访问到value
	m1[4] = 40;
	cout << m1[4] << endl;
	printMap(m1);
	//删除
	cout << endl;
	m1.erase(m1.begin());
	printMap(m1);
	//
	cout << endl;
	m1.erase(3);//按照key删除
	printMap(m1);
	//清空操作
	m1.erase(m1.begin(), m1.end());// = m1.clear();
}
int main()
{
	test01();
	system("pause");
	return 0;
}

运行结果:

40
key=1 value=10
key=2 value=20
key=3 value=30
key=4 value=40

key=2 value=20
key=3 value=30
key=4 value=40

key=2 value=20
key=4 value=40
请按任意键继续. . .

总结:

  • 插入---insert
  • 删除---erase
  • 清空---clear

9.5 map查找和统计

功能描述:

  • 对map容器进行查找数据以及统计数据
    函数原型:
  • find(key);//查找key元素是否存在,返回该键元素的迭代器;若不存在,返回set.end();
  • count(key);//统计key的元素个数

示例:

#include<iostream>
using namespace std;
#include<map>
//map查找和统计
void printMap(map<int, int>& m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key=" << (*it).first << " value=" << it->second << endl;
	}
	cout << endl;
}
void test01()
{
	map<int, int>m1;
	m1.insert(make_pair(1, 10));
	m1.insert(pair<int, int>(2, 20));
	m1[3] = 30;
	//m1.find(3);返回的是一个迭代器,需要创建一个迭代器接收
	map<int, int>::iterator pos = m1.find(3);
	if (pos != m1.end())
	{
		cout << "查到了元素key = " << (*pos).first << " value = " << pos->second << endl;
	}
	else
	{
		cout << "未找到元素" << endl;
	}
	//统计
	//map不允许插入重复的key,对于count统计而言,结果要么是0,要么是1
	int num=m1.count(3);
	cout << "num=" << num << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

运行结果:

查到了元素key = 3 value = 30
num=1
请按任意键继续. . .

总结:

  • 查找---find(返回的是迭代器)
  • 统计---count(对于map,结果是0或1)

9.6 map容器排序

学习目标:

  • map容器默认排序规则为按照key值进行从大到小的操作,掌握如何改变排序规则
    主要技术点:
  • 利用仿函数,可以改变排序规则

示例:

#include<iostream>
using namespace std;
#include<map>
//map容器排序
class myCompare
{
public:
	bool operator()(int v1, int v2)const//仿函数
	{
		return v1 > v2;//降序排序
		//return v1<v2  升序排序
	}
};
void printMap(map<int, int>& m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
	cout << endl;
}
void test01()
{
	//默认排序规则,从小->大
	map<int, int>m1;
	m1.insert(make_pair(1, 10));
	m1.insert(pair<int, int>(2, 20));
	m1[3] = 30;
	m1.insert(make_pair(4, 40));
	m1.insert(make_pair(5, 50));
	printMap(m1);
	//修改排序规则
	map<int, int,myCompare>m2;
	m2.insert(make_pair(1, 10));
	m2.insert(pair<int, int>(2, 20));
	m2[3] = 30;
	m2.insert(make_pair(4, 40));
	m2.insert(make_pair(5, 50));
	for (map<int, int>::iterator it = m2.begin(); it != m2.end(); it++)
	{
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
}
int main()
{
	test01();
	system("pause");
	return 0;
}

运行结果:

key = 1 value = 10
key = 2 value = 20
key = 3 value = 30
key = 4 value = 40
key = 5 value = 50

key = 5 value = 50
key = 4 value = 40
key = 3 value = 30
key = 2 value = 20
key = 1 value = 10
请按任意键继续. . .

总结:

  • 利用仿函数可以指定map容器的排序规则
  • 对于自定义数据类型,map必须要指定排序规则,同set容器

posted @ 2022-02-13 16:09  卿源  阅读(43)  评论(0编辑  收藏  举报