C++:map容器

1.基本概念

  • map容器中所有容器都是pair(成对出现)
  • pair中第一个元素是key(索引),第二个值是value(实值)
  • 所有元素根据元素键值自动排序

本质:关联式容器,底层为二叉树

优势:

  • 根据key查找value
  • map中不允许重复值key,value可以重复
  • multimap中允许重复值出现 ,key可以重复

 2.map函数的构造与赋值

  • map<T1,T2> mp;//默认构造函数
  • map<const map &mp>;//拷贝构造函数
  • map &operator=(const map &mp)//等号赋值
//打印
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;
	m.insert(pair<int,int>(1,10));
	m.insert(pair<int, int>(2,20));
	m.insert(pair<int, int>(3,30));
	m.insert(pair<int, int>(4,30));
	printMap(m);

	//拷贝构造
	map<int, int> m2(m);
	printMap(m2);
	//赋值操作
	map<int, int> m3;
	m3 = m2;
}

3.map容器的大小和交换

size();//返回元素中元素数目

empty();//判断容器是否为空

swap(st);//交换两个集合容器

4.map容器的插入与删除

 insert(elem);

clear();

erase(pos);删除pos迭代器指向的元素,返回下一个元素的迭代器

erase(beg,end);

erase(key);//删除容器中键是key的元素,value值输入没用

map<int, int> m;
	m.insert(pair<int, int>(1, 10));
	//第二种
	m.insert(make_pair(2, 20));
	//第三种
	m.insert(map<int, int>::value_type(3, 30));
	//第四种,不建议插入,但可以利用key访问value
	m[4] = 40;
	printMap(m);
	//删除
	cout << "-----------" << endl;
	m.erase(m.begin());
	printMap(m);
	
	cout << "------------" << endl;
	m.erase(3);
	printMap(m);

 5.map容器查找与统计

find(key);//查找key是否存在,存在返回键元素迭代器;不存在,返回end();迭代器需要用iterator接受

cout(key);统计key元素的个数,如key为3有几个这种,具体数值

map<int, int> m;
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));

	map<int, int>::iterator pos = m.find(3);
	if (pos != m.end())
	{
		cout << "查找到元素 key=" << pos->first << "  value= " << pos->second << endl;
	}
	else
	{
		cout << "未查找到该元素" << endl;
	}
	printMap(m);
	int num = m.count(3);
	cout << "num= " << num << endl;

6.map排序

利用仿函数改变排序规则

int数据类型

class myCompare
{
public:
	bool operator()(int v1, int v2)
	{
		return v1 > v2;
	}
};

//打印
void printMap(map<int, int,myCompare>&m)
{
	for (map<int, int,myCompare>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key值=" << it->first << " value值=" << it->second << endl;
	}
}

void test01()
{
	map<int, int,myCompare> m;
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));

	printMap(m);

}

自定义数据类型:operator降序排列是改变<>左边的参数,需要调换person与int的位置,编辑第一个参数

//降序排列
class compare
{
public:
	bool operator()(const Person &p1,const Person &p2)
	{
		return p1.m_Age>p2.m_Age;
	}
};
//自定义数据类型
void test02()
{
	map<Person,int,compare> m;
	Person p1("张三", 24);
	Person p2("许八", 18);
	Person p3("黄芪", 20);
	Person p4("王五", 19);
	Person p5("李四", 18);

	m.insert(make_pair(p1, 1));
	m.insert(make_pair(p2, 2));
	m.insert(make_pair(p3, 3));
	m.insert(make_pair(p4, 4));
	m.insert(make_pair(p5, 5));

	for (map< Person,int,compare>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "序号为: "<<it->second<<"  姓名:" << it->first.m_Name << " 年龄:" << it->first.m_Age  << endl;
	}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值