STL:map ❤️ 容器用法

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL:map ❤️ 容器用法相关的知识,希望对你有一定的参考价值。

1 map 基本概念

简介:

  • map中所有元素都为pair(对组)
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素按key值从小到大 自动排序

本质:

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

STL容器分为序列式容器关联式容器两种:
序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置。
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系,放的同时也进行了排序

优点:

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

map和multimap区别

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

2 map 构造和赋值

函数原型:

构造:

  • map<T1, T2> mp; //默认构造:
  • map(const map &mp); //拷贝构造

赋值:

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

示例: 分别使用默认构造、拷贝构造、赋值操作,并打印map容器中的元素

代码:

#include <iostream>
#include <map>

using namespace std;

//打印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;
}

int main()
{
	//--------------------------- 1、默认构造 ---------------------------
	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));
	printMap(m);
	//==================================================================

	//--------------------------- 2、拷贝构造 ---------------------------
	map<int, int> m2(m);
	printMap(m2);
	//==================================================================

	//----------------------------- 3、赋值 -----------------------------
	map<int, int> m3;
	m3 = m2;
	printMap(m3);			
	//==================================================================
	
	return 0;
}

输出结果:

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

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

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

3 map 大小和交换

示例: 判断map大小;交换两个map

代码:

#include <iostream>
#include <map>

using namespace std;

//打印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;
}

int main()
{
	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));

	//---------- 1、判断map是否为空,若不为空,输出容器大小 ----------
	if (m.empty())
	{
		cout << "m为空!\\a" << endl;
	}
	else
	{
		cout << "m的大小为:" << m.size() << endl;
	}
	//==============================================================


	//---------------------- 2、交换两个map容器----------------------
	map<int, int> m1;
	m1.insert(pair<int, int>(4, 40));
	m1.insert(pair<int, int>(5, 50));
	m1.insert(pair<int, int>(6, 60));

	cout << "交换前:" << endl;
	printMap(m);
	printMap(m1);

	cout << "交换后:" << endl;
	m.swap(m1);
	printMap(m);
	printMap(m1);
	//==============================================================

	return 0;
}

输出结果:

m的大小为: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

4 map 插入和删除

函数原型:

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


m.begin()指向map第一个元素位置,m.end()指向map最后一个元素的下一个位置

示例:

代码:

#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++)
	{
		cout << "key = " << it->first << ", value = " << it->second << endl;
	}
	cout << endl;
}

int main()
{
	//----------------------------- 1、插入 -----------------------------
	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));
	//第四种插入方式
	m[4] = 40;

	printMap(m);
	//==================================================================

	//----------------------------- 2、删除 -----------------------------
	m.erase(m.begin());
	cout << "删除第一个元素" << endl;
	printMap(m);

	m.erase(2);
	cout << "删除key值为2的元素" << endl;
	printMap(m);

	//==================================================================

	//----------------------------- 3、清空 -----------------------------
	//方式1:
	m.erase(m.begin(), m.end());
	if (m.empty())
	{
		cout << "map为空!" << endl;
	}
	else
	{
		printMap(m);
	}
	

	//第一种插入方式
	m.insert(pair<int, int>(1, 10));
	//第二种插入方式
	m.insert(make_pair(2, 20));
	//第三种插入方式
	m.insert(map<int, int>::value_type(3, 30));
	//第四种插入方式
	m[4] = 40;
	cout << "\\n重新插入元素后" << endl;
	printMap(m);

	//方式2:
	m.clear();
	if (m.empty())
	{
		cout << "map为空!" << endl;
	}
	else
	{
		printMap(m);
	}

	return 0;
}

输出结果:

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的元素
key = 3, value = 30
key = 4, value = 40

map为空!

重新插入元素后
key = 1, value = 10
key = 2, value = 20
key = 3, value = 30
key = 4, value = 40

map为空!

5 map 查找和统计

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
  • count(key); //统计key的元素个数,对于map,结果为 0 或 1,multimap才有大于 1 的情况

示例:

#include <iostream>
#include <map>

using namespace std;

int main()
{
	//--------------------------------------- 构造map ---------------------------------------
	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, 40));
	//=======================================================================================


	//--------------------------------------- 1、查找 ---------------------------------------
	map<int, int>::iterator pos = m.find(3);

	if (pos != m.end())
	{
		cout << "->找到了元素,key = " << pos->first << ", value = " << pos->second << endl;
	}
	else
	{
		cout << "->未找到元素!\\a" << endl;
	}
	//=======================================================================================


	//--------------------------------------- 2、统计 ---------------------------------------
	int num = m.count(2);
	cout << "->key = 2 的元素个数为 " << num << endl;
	//=======================================================================================

	return 0;
}

输出结果:

->找到了元素,key = 3, value = 30
->key = 2 的元素个数为 1

6 map 容器排序

map容器默认排序规则为: 按照key值进行 从小到大排序

可通过仿函数,实现按key值从大到小排序

示例:

#include <iostream>
#include <map>

using namespace std;

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

int main()
{
	map<int, int, MyCompare> m;
	m.insert(make_pair(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));
	m.insert(make_pair(5, 50));


	cout << "-利用仿函数实现按key值从大到小排序:" << endl;
	for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key:" << it->first << " value:" << it->second << endl;
	}

	//MyCompare 可以省略
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key = " << (*it).first << ", value = " << (*it).second << endl;
	}
	cout << endl;

	return 0;
}

注意:

只要在构造时采用了仿函数,其默认排序方式就改变了,排序方式与仿函数一致

7 pair 对组创建

两种创建方式:

  • pair<type, type> p ( value1, value2 );
  • pair<type, type> p = make_pair( value1, value2 );

示例:

#include <iostream>
#include <string>

using namespace std;

int main()
{
	pair<string, int> p(string("老王"), 18);
	cout << "姓名: " <<  p.first << " 年龄: " << p.second << endl;

	pair<string, int> p2 = make_pair("小绿", 30);
	cout << "姓名: " << p2.first << " 年龄: " << p2.second << endl;
	
	return 0;
}

输出结果:

姓名: 老王 年龄: 18
姓名: 小绿 年龄: 30

参考链接:

https://www.bilibili.com/video/BV1et411b73Z?p=231

以上是关于STL:map ❤️ 容器用法的主要内容,如果未能解决你的问题,请参考以下文章

STL —— map用法及实例详解(超详细完整)

STL map&set用法详解

STL map&set用法详解

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL:map用法总结

map的常用用法详解