C++中的map/multimap容器(黑马程序员)

目录

  • map/multimap 容器
    • map/multimap容器的使用率仅次于vector和list容器
    • STL中的高性能高效率指的就是map容器。他可以从非常大的数据中快速的找到我想要的数据
    • 1 map基本概念
      • map/multimap容器的迭代器也不支持随机访问
    • 2 map构造和赋值
      • 总结:map中所有元素都是成对出现,插入数据时要使用对组
    • 3 map大小和交换
    • 4 map插入和删除
    • 5 map查找和统计
      • map容器插重复键值元素,等于白插
    • 6 map容器排序
      • 因为map是根据key值进行排序的,所以更改的排序规则针对的是key值。必须在容器插入数据前就给出排序规则。


map/multimap 容器


视频与文档链接



map/multimap容器的使用率仅次于vector和list容器


STL中的高性能高效率指的就是map容器。他可以从非常大的数据中快速的找到我想要的数据



1 map基本概念

简介:

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

本质:

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

优点:

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

map与multimap使用方法一致,但是map和multimap也有区别

  • map不允许容器中有重复key值元素,但是value值可以重复
  • multimap允许容器中有重复key值元素,也允许value值重复

map/multimap容器的迭代器也不支持随机访问





2 map构造和赋值

功能描述:

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

函数原型:

构造:

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

赋值:

  • map& operator=(const map &mp); //重载等号操作符



#include
using namespace std;

#include

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



void test01() {
	// 默认构造
	map m1;

// 注意插入的时候一定要用对组!!
	m1.insert(pair(1, 10));
	m1.insert(pair(8, 205));
	m1.insert(pair(13, 305));
	m1.insert(pair(4, 40));
	m1.insert(pair(4, 40));
	cout << "采用默认构造方法创建m1容器" << endl;
	printMap(m1);
	cout << "map容器不允许有重复的Key值元素!和set容器一样编译器并不会报错,但最后还是相当于没插这个数。" << endl< m2(m1);
	cout << "m2拷贝自m1" << endl;
	printMap(m2); 
	cout << endl;


	// 等号赋值
	mapm3;
	m3.insert(pair(1, 10));
	m3.insert(pair(2, 20));
	m3.insert(pair(3, 30));
	m3.insert(pair(4, 40));
		cout << "容器m3如下:" << endl;
	printMap(m3); cout << endl;

	cout << "m4=m3" << endl;
	mapm4 = m3;
	printMap(m4); cout << endl;

}

int main() {
	test01();
	cin.get();
	return 0;

}

C++中的map/multimap容器(黑马程序员)_第1张图片

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





3 map大小和交换

功能描述:

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

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器



#include
using namespace std;

#include

// 打印函数
void printMap(map& m) {
	for (map::iterator it = m.begin(); it != m.end(); it++) {
		cout << "Key值:" << it->first << "    " << "数值:" << it->second << endl;


	}
	cout << endl;
}



void test01() {
	// 创建map容器
	map m1;

	m1.insert(pair(1, 10));
	m1.insert(pair(2, 20));
	m1.insert(pair(3, 30));
	m1.insert(pair(4, 40));
	cout << "m1交换前:" << endl;
	cout << "大小:" << m1.size() << endl;
	printMap(m1); cout << endl;
	

	// 另一个map容器
	map m2;

	m2.insert(pair(9, 90));
	m2.insert(pair(10 ,100));
	m2.insert(pair(11, 110));
	m2.insert(pair(12, 120));
	m2.insert(pair(15, 150));
	cout << "m2交换前:" << endl;
	cout << "大小:" << m2.size() << endl;
	printMap(m2); cout << endl;


	cout << "m1交换后:" << endl;
	m1.swap(m2);
	cout << "大小:" << m1.size() << endl;
	printMap(m1);
	cout << "m2交换后:" << endl;
	cout << "大小:" << m2.size() << endl;
	printMap(m2);

   
}

int main() {
	test01();
	cin.get();
	return 0;

}

C++中的map/multimap容器(黑马程序员)_第2张图片

总结:

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





4 map插入和删除

功能描述:

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

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除迭代器区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(key); //删除容器中键值为key的元素


map/multimap有以下四种插入方式

map m1;
map m2;
map m3;

// 第一种是常规插入方式。利用对组
m1.insert(pair(1, 10));

// 第二种插入方式。也是利用对组,不过不需要写模板参数列表了。
m2.insert(make_pair(5, 50));

// 第三种,比较长,不建议使用
m3.insert(map::value_type(9, 90));

// 第四种,像数组一样。重载了[]
// 不过有缺陷。如果m[n]中的键值n不存在,那么直接cout<

第三种插入方式少用。
第四种方式不建议去插数,但推荐用这种方法代替迭代器,通过key去访问value
map容器的迭代器不支持随机访问,访问元素时比较麻烦




综合:

#include
using namespace std;
#include

// 打印函数
void printMap(map& m) {
	for (map::iterator it = m.begin(); it != m.end(); it++) {
		cout << "Key值:" << it->first << "    " << "数值:" << it->second << endl;


	}

	
	cout << endl;
}


void test01() {
	map m1;
	map m2;
	map m3;

	// 插入方法,第一种,利用对组
	cout << "第一种插入方法:" << endl;
	m1.insert(pair(1, 10));
	m1.insert(pair(2, 20));
	m1.insert(pair(3, 30));
	m1.insert(pair(4, 40));
	cout << "m1里的元素为:" << endl;
	printMap(m1);
	cout << endl;

	// 第二种插入方法,make_pair
	cout << "第二种插入方法:" << endl;
	m2.insert(make_pair(5, 50));
	m2.insert(make_pair(6, 60));
	m2.insert(make_pair(7, 70));
	m2.insert(make_pair(8, 80));
	cout << "m2里的元素为:" << endl;
	printMap(m2);
	cout << endl;


	// 第三种插入方法,::value_type,不推荐
	cout << "第三种插入方法:" << endl;
	m3.insert(map::value_type(9, 90));
	m3.insert(map::value_type(10, 100));
	m3.insert(map::value_type(11, 110));
	m3.insert(map::value_type(12, 120));
	cout << "m3里的元素为:" << endl;
	printMap(m3);
	cout << endl;

	// 第四种
	m1[5] = 50;
	m1[6] = 70;
	cout << "第四种方式:" << endl;
	cout << "m1里的元素为:" << endl;
	// 直接打印cout<C++中的map/multimap容器(黑马程序员)_第3张图片

总结:

  • map插入和删除方式很多,要熟练掌握
  • 插入 — insert
  • 删除 — erase
  • 清空 — clear





5 map查找和统计

功能描述:

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

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数,对于map容器。元素个数要么为0,要么为1


#include
using namespace std;

#include

// 打印函数
void printMap(map& m) {
	for (map::iterator it = m.begin(); it != m.end(); it++) {
		cout << "Key值:" << it->first << "    " << "数值:" << it->second << endl;


	}
	cout << endl;
}



void test01() {
	// 创建map容器
	map m1;

	m1.insert(make_pair(1, 10));
	m1.insert(make_pair(2, 20));
	m1.insert(make_pair(3, 30));
	m1.insert(make_pair(4, 40));
	m1.insert(make_pair(4, 50));
	m1.insert(make_pair(3, 60));
	cout << "m1里的元素为:" << endl;
	printMap(m1); 
	cout << "m1.size()=" << m1.size() << endl;
	cout << endl;
	map::iterator it1 = m1.find(5);
	map::iterator it2 = m1.find(4);
	cout << "查找m1容器中键值为5的元素" << endl;
	if (it1 == m1.end()) {
		cout << "m1容器里没有键值为5的元素!!" << endl << endl;;

	}
	else {
		cout << "键值为5的元素已找到!" << endl;
		cout << "它的value值为" << it1->second << endl << endl;;
	}

	cout << "查找m1容器中键值为4的元素" << endl;
	if (it2 == m1.end()) {

		cout << "m1容器里没有键值为4的元素!!" << endl << endl;;
	}
	else {
		cout << "键值为4的元素已找到!" << endl;
		cout << "它的value值为" << it2->second << endl<

C++中的map/multimap容器(黑马程序员)_第4张图片

总结:

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

map容器插重复键值元素,等于白插






6 map容器排序

学习目标:

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

因为map是根据key值进行排序的,所以更改的排序规则针对的是key值。必须在容器插入数据前就给出排序规则。


主要技术点:

  • 利用仿函数,可以改变排序规则


#include
using namespace std;

#include
#include

class Person {
public:
	string m_Name;
	int m_Age;
	Person(string name, int age) :m_Name(name), m_Age(age) {}


};
// 针对内置数据类型的排序
class MyCompare1 {
public:
	// 修改内置数据类型排序为降序
	bool operator()(int v1, int v2) const{
		return v1 > v2;

	}
	// 关于自定义数据类型的排序规则
	// 升序排序
	bool operator()(Person p1, Person p2)const
	{
		return p1.m_Age < p2.m_Age;

	}

};
class MyCompare2
{
public:
	bool operator()(int v1, int v2) const
	{
		return v1 m1;

	m1.insert(pair(1, 10));
	m1.insert(pair(2, 20));
	m1.insert(pair(3, 30));
	m1.insert(pair(4, 40));
	cout << "针对内置数据类型的排序修改,根据key值从大到小排序" << endl;
	for (map::iterator it = m1.begin(); it != m1.end(); it++) {
		cout << "Key值:" << it->first << "   " << "数值:" << it->second << endl;


	}
	cout << endl;


	// 针对自定义类型的map容器
	map m2;
	Person p1("aweawe", 25);
	Person p2("wkkkk", 36);
	Person p3("EDG", 66);
	Person p4("RNG", 66);
	Person p5("TES", 86);
	Person p6("JDG", 99);
	m2.insert(pair(p1, p1.m_Name));
	m2.insert(pair(p2, p2.m_Name));
	m2.insert(pair(p3, p3.m_Name));
	m2.insert(pair(p4, p4.m_Name));
	m2.insert(pair(p5, p5.m_Name));
	cout << "m2.size()=" << m2.size() << endl<::iterator it = m2.begin(); it != m2.end(); it++) {
		cout << "Key值(年龄):" << it->first.m_Age<< "   " << "姓名:" << it->second << "    "<::iterator it1 = m2.find(p4);
	cout << "查找m2容器有没有年龄为66的元素" << endl;
	if (it1 == m2.end()) {
		cout << "容器里没有年龄为66的元素!!!" << endl << endl;;

	}
	else {
		cout << "已找到!" << endl;
		cout << "它的姓名为" << it1->second << endl << endl;;
	}
	map::iterator it2 = m2.find(p6);
	cout << "查找m2容器有没有年龄为99的元素" << endl;
	if (it2 == m2.end()) {
		cout << "容器里没有年龄为99的元素!!!" << endl << endl;;

	}
	else {
		cout << "已找到!" << endl;
		cout << "它的姓名为" << it1->second << endl << endl;;
	}




}

int main() {
	test01();
	cin.get();
	return 0;

}

C++中的map/multimap容器(黑马程序员)_第5张图片

总结:

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






你可能感兴趣的:(C++,c++,算法,开发语言)