[c++学习笔记23]:map/multimap容器

今天学习map容器

1 map基本概念

简介:

  • map中所有元素都是pair 也就是对组。类似py的字典。
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值key自动排序

本质:

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

优点:

  • 可以根据key值快速找到value值

map和multimap区别

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

2 map构造和赋值

功能描述:

  • 对map容器进行构造和赋值操作

函数原型:

构造:

  • map mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数

赋值:

  • map& operator=(const map &mp); //重载等号操作符
#include
using namespace std;
#include
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 test()
{
	map<int, int>m;//默认构造
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(7, 50));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(4, 40));
	printMap(m);
	//拷贝构造
	map<int, int>m1(m);
	printMap(m1);
	//赋值
	map<int, int>m2;
	m2 = m;
	printMap(m2);

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

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

3 map大小和交换

功能描述:

  • 统计map容器大小以及交换map容器

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器
#include
using namespace std;
#include
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>m;//默认构造
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(7, 50));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(4, 40));
	if (m.empty())
	{
		cout << "m为空!" << endl;
	}
	else
	{
		cout << "m不为空,且大小为:" << m.size() << endl;
	}

}
void test02()
{
//交换
	map<int, int>m1;
	m1.insert(pair<int, int>(1, 10));
	m1.insert(make_pair(2, 20));
	m1.insert(pair<int, int>(3, 30));
	map<int, int>m2;
	m2.insert(make_pair(4, 40));
	m2.insert(make_pair(5, 50));
	cout << "交换前:" << endl;
	printMap(m1);
	printMap(m2);
	cout << "交换后:" << endl;
	m1.swap(m2);
	printMap(m1);
	printMap(m2);
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

总结:

  • 统计大小 — size
  • 判断是否为空 — empty
  • 交换容器 — swap

4 map插入和删除

功能描述:

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

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(key); //删除容器中值为key的元素。
#include
using namespace std;
#include
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>m;//插入的3种方式
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(7, 50));
	m.insert(map<int,int>::value_type(3,30));
	m[5] = 50;
	printMap(m);

	m.erase(m.begin());
	printMap(m);
	m.erase(5);///擦除key为5的那个。
	printMap(m);
	m.erase(m.begin(), m.end());
	printMap(m);
	m.clear();
	printMap(m);
}

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

总结:

  • map插入方式很多,记住其一即可
  • 插入 — insert
  • 删除 — erase
  • 清空 — clear

5 map查找和统计

功能描述:

  • 对map容器进行查找数据以及统计数据

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数, 只可以是0或者1
#include
using namespace std;
#include
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>m;//插入的3种方式
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(7, 50));
	m.insert(map<int,int>::value_type(3,30));
	m[5] = 50;
	printMap(m);
	//统计
	map<int, int>::iterator pos = m.find(7);
	if (pos != m.end())
	{
		cout << "找到了元素,key= " << (*pos).first << "value =" << (*pos).second << endl;
	}
	else {
		cout << "未找到元素!" << endl;
	}
	//查找
	int num = m.count(5);
	cout<< "num = " << num << endl;
}
void test02()
{

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

总结:

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

6 map容器排序

学习目标:

  • map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则,实现从大到小排序!!!

主要技术点:

  • 利用仿函数,可以改变排序规则
    vs2019 需要加const bool operator()(int a, int b)const
#include
using namespace std;
#include
class Compare
{
public:
	bool operator()(int a, int b)const
	{
		return a > b;
	}
};
void test01()
{
	map<int, int,Compare>m;//插入的3种方式
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(7, 50));
	m.insert(map<int,int>::value_type(3,30));
	for (map<int, int, Compare>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key是" << it->first << "value是" << it->second << endl;
	}
	cout << endl;
	
}
void test02()
{

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

总结:

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

终于学完啦map!!!!!!!!!!!!!
可以开始复习考试了!

打个小广告,欢迎关注我的公众号“麦香E站”,分享人工智能,信通学习,数学提高,外语学习,生活理财等多方面知识以及我多年积累的学习资源分享~
公众号后台回复 “编程” 获取我多年来积攒的海量编程电子书~
后台回复“latex”获取我倾力所作latex快速入门手册~
在这里插入图片描述

你可能感兴趣的:(c++)