STL map容器 multimap容器

12 篇文章 0 订阅
9 篇文章 0 订阅

STL中的容器:

map容器 multimap容器 常用接口及用法:


map / multimap 容器:map 容器和 multimap 容器也是关联式容器,底层的结构是用二叉树红黑树)实现的;

mapmultimap 容器是使用频率仅次于 vector 容器和 list 容器的一种容器;STL 所说的高性能高效率指的就是这个容器;


mapmultimap 容器简介:

1.map 中的所有元素都是 pair 对组;

2.pair 对组中的第一个元素为 key(键值),它是用来起索引作用的;pair 对组中的第二个元素为 value,它也被称为实值;

map 容器的高性能、高效率就体现在它的键值上。由于键值的索引作用,我们可以快速、准确地找到容器中键值所对应的元素)

例如:中国有14亿人口,人口数量巨大,但其实每个人都有唯一的一个身份证号,因此我们可以通过身份证号在茫茫人海中精准地索引到一个人,而这个身份证号就可以称为键值(key),我们这个人自身就可以称为实值(value)。

3.所有的元素插入的时候会根据键值自动排序;


mapmultimap 容器的区别:

1.map 容器不允许插入相同的 key 元素的数据;

2.multimap 容器允许插入相同的 key 元素的数据;


各种函数接口具体如何使用,下面的代码块中会有详细的使用方法


mapmultimap 容器的构造函数和赋值:


mapmultimap 容器的构造函数:

1.map<T1,T2> mp; 默认(无参)构造函数

2.map(const map & mp); 拷贝构造函数


mapmultimap 容器的赋值:

1.map& operator=(const map & mp); 通过重载赋值运算符的方式给新创建的 map 容器赋值;


#include <iostream>
#include <map>  //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printMap(const map<int,string> & m)
{
	for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
	cout << endl;
}


void test_1()  //map容器的构造函数 
{
	map<int,string> m1;  //默认(无参)构造函数
	
	//将对组插入到map容器
	m1.insert(pair<int,string>(1,"Yauge_1"));  //这里是创建了一个匿名的对组,并把这个对组插入到map容器中
	m1.insert(pair<int,string>(3,"Yauge_3"));
	m1.insert(pair<int,string>(2,"Yauge_2"));
	m1.insert(pair<int,string>(5,"Yauge_5"));
	m1.insert(pair<int,string>(4,"Yauge_4"));
	
	//遍历输出打印
	printMap(m1);
	
	map<int,string> m2(m1);  //拷贝构造函数
	printMap(m2); 
}

void test_2()  //map容器的赋值 
{
	map<int,string> m1;
	
	//将对组插入到map容器
	m1.insert(pair<int,string>(1,"Yauge_1"));  //这里是创建了一个匿名的对组,并把这个对组插入到map容器中
	m1.insert(pair<int,string>(3,"Yauge_3"));
	m1.insert(pair<int,string>(2,"Yauge_2"));
	m1.insert(pair<int,string>(5,"Yauge_5"));
	m1.insert(pair<int,string>(4,"Yauge_4"));
	
	//遍历输出打印 
	printMap(m1);
	
	map<int,string> m2;
	m2 = m1;
	printMap(m2);
}

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

mapmultimap 容器的大小和交换:


mapmultimap 容器的大小:

1.empty(); 判断 map 容器是否为空;

2.size(); 用于查看容器的大小(元素个数);


mapmultimap 容器的交换:

1.swap(mp); 将容器 mp 与本身的 map 容器进行交换;


#include <iostream>
#include <map>  //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printMap(const map<int,string> & m)
{
	for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
	cout << endl;
}

void test_1()  //map容器的大小 
{
	map<int,string> m1;  //默认(无参)构造函数
	
	//将对组插入到map容器
	m1.insert(pair<int,string>(1,"Yauge_1"));  //这里是创建了一个匿名对组,并把这个对组插入到map容器中
	m1.insert(pair<int,string>(3,"Yauge_3"));
	m1.insert(pair<int,string>(2,"Yauge_2"));
	m1.insert(pair<int,string>(5,"Yauge_5"));
	m1.insert(pair<int,string>(4,"Yauge_4"));
	
	//遍历输出打印
	printMap(m1);
	
	if(m1.empty())  //判断当前容器是否为空,如果容器为空,则返回true,否则返回false
	{
		cout << "m1容器为空" << endl;
	}
	else
	{
		cout << "m1容器不为空" << endl;
		cout << "m1容器的大小为:" << m1.size() << endl;  //用于查看容器的大小(元素个数)
	}
}

void test_2()  //map容器的交换 
{
	map<int,string> m1;  //map容器m1 
	
	//将对组插入到m1中 
	m1.insert(pair<int,string>(1,"Yauge_1"));
	m1.insert(pair<int,string>(3,"Yauge_3"));
	m1.insert(pair<int,string>(2,"Yauge_2"));
	
	map<int,string> m2;  //map容器m2
	
	//将对组插入到m2中
	m2.insert(pair<int,string>(5,"Yauge_5"));
	m2.insert(pair<int,string>(4,"Yauge_4"));
	m2.insert(pair<int,string>(6,"Yauge_6"));
	
	cout << "交换前:" << endl;
	printMap(m1);
	printMap(m2);
	
	cout << "—————————————————————" << endl;
	
	m1.swap(m2);  //将m1和m2交换 
	
	cout << "交换后:" << endl;
	printMap(m1);
	printMap(m2);
}

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

mapmultimap 容器的插入和删除:

1.insert(elem);map 容器中插入 elem 元素;

2.erase(key); 删除 map 容器中与键值 key 匹配的元素;

4.erase(pos); 通过迭代器删除掉 map 容器指定位置的数据;

5.erase(begin,end); 通过迭代器删除掉 map 容器区间 [begin,end) 之间的数据;

6.clear(); 清空当前的 map 容器;

#include <iostream>
#include <map>  //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printMap(const map<int,string> & m)
{
	for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
	cout << endl;
}

void test_1()  //map容器的插入 
{
	map<int,string> m1;
	
	//map容器的插入(四种插入方式) 
	
	m1.insert(pair<int,string>(1,"Yauge_1"));  //第一种插入方式
	
	m1.insert(make_pair(2,"Yauge_2"));  //第二种插入方式
	
	m1.insert(map<int,string>::value_type(3,"Yauge_3"));  //第三种插入方式(不推荐使用,因为它太长了,也不好理解) 
	
	m1[4] = "Yauge_4";  //第四种插入方式(不推荐使用,这种重载[]的方式更适合用来索引,前提是这个元素确实存在于容器中,否则容器会自动创建你要找的元素,只不过实值(value)被赋值为0)
	
	printMap(m1);
}

void test_2()  //map容器的删除
{
	map<int,string> m1;
	
	m1.insert(make_pair(1,"Yauge_1"));
	m1.insert(make_pair(2,"Yauge_2"));
	m1.insert(make_pair(3,"Yauge_3"));
	m1.insert(make_pair(4,"Yauge_4"));
	m1.insert(make_pair(5,"Yauge_5"));
	
	printMap(m1);
	
	m1.erase(m1.begin());  //通过迭代器删除掉map容器指定位置的数据
	printMap(m1);
	
	m1.erase(3);  //删除map容器中与键值key匹配的元素
	printMap(m1);
	
	m1.erase(m1.begin(),m1.end());  //通过迭代器删除掉map容器区间[m1.begin(),m1.end())之间的数据
	printMap(m1);
	
	m1.clear();  //清空当前的map容器
	printMap(m1);
} 

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

map 容器的查找和统计:


map 容器的查找:

1.find(key);map 容器中查找键值为 key 的元素是否存在,若存在,返回该元素的迭代器;若不存在,返回 map.end()

键值为 key 的元素不存在,返回 map.end() ,可以理解成找到了 map 容器的最后一个元素都没有找到键值为 key 的元素,因此返回的是 map 容器的末尾位置的迭代器;


map 容器的统计:

1.count(key);map 容器中统计键值为 key 的元素出现的次数,返回值即为键值为 key 的元素出现的次数;

对于 map 容器,只可能返回 0 或者 1;对于 multimap 容器,返回值可以大于 1

因为 map 容器中键值为 key 的元素不可以重复,但 multimap 容器中键值为 key 的元素是允许重复的。也就是说,在 map 容器中,键值为 key 的元素最多出现一次,所以 map 容器只能返回 0 或者 1


#include <iostream>
#include <map>  //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printMap(const map<int,string> & m)
{
	for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
	cout << endl;
}

void printMultimap(const multimap<int,string> & m)
{
	for(multimap<int,string>::const_iterator it=m.begin();it!=m.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
	cout << endl;
}

void test_1()  //map容器的查找 
{
	map<int,string> m1;
	
	m1.insert(make_pair(1,"Yauge_1"));
	m1.insert(make_pair(2,"Yauge_2"));
	m1.insert(make_pair(3,"Yauge_3"));
	m1.insert(make_pair(4,"Yauge_4"));
	m1.insert(make_pair(5,"Yauge_5"));
	
	printMap(m1);
	
	map<int,string>:: iterator pos = m1.find(3);  //用迭代器接收find()函数的返回值
	
	if(pos==m1.end())
	{
		cout << "没有找到目标键值所对应的元素" << endl;
	}
	else
	{
		cout << "找到目标键值所对应的元素" << endl;
		cout << "key(键值):" << (*pos).first << "     value(实值):" << (*pos).second << endl;
	}
}

void test_2()  //map和multimap容器的统计
{
	map<int,string> m1;  //map容器m1 
	
	m1.insert(make_pair(1,"Yauge_1"));
	m1.insert(make_pair(3,"Yauge_3"));
	m1.insert(make_pair(2,"Yauge_2"));
	m1.insert(make_pair(3,"Yauge_33"));
	m1.insert(make_pair(4,"Yauge_4"));
	m1.insert(make_pair(5,"Yauge_5"));
	m1.insert(make_pair(3,"Yauge_333"));
	
	printMap(m1);
	
	int num_1 = m1.count(3);  //num_1为键值为3的元素在map容器中出现的次数
	
	cout << "目标键值所对应的元素出现的次数为:" << num_1 << endl;
	
	cout << "——————————————————————" << endl; 
	
	multimap<int,string> m2;  //multimap容器m2 
	
	m2.insert(make_pair(1,"Yauge_1"));
	m2.insert(make_pair(3,"Yauge_3"));
	m2.insert(make_pair(2,"Yauge_2"));
	m2.insert(make_pair(3,"Yauge_33"));
	m2.insert(make_pair(4,"Yauge_4"));
	m2.insert(make_pair(5,"Yauge_5"));
	m2.insert(make_pair(3,"Yauge_333"));
	
	printMultimap(m2);
	
	int num_2 = m2.count(3);  //num_2为键值为3的元素在multimap容器中出现的次数
	
	cout << "目标键值所对应的元素出现的次数为:" << num_2 << endl;
	
}

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

map 容器指定排序规则:

利用仿函数(重载 () 运算符)的技术,修改 map 容器的排序规则(map 容器默认排序规则为从小到大,我们人为修改为从大到小);

但因为 map 容器在插入时会自动的做排序,所以要修改默认排序规则的话,应该要在插入操作前修改排序规则;

在使用到 mapmultimap 容器存放自定义数据类型时,需要提前指定好排序规则,否则编译器不知道怎么将我们的自定义数据插入到 mapmultimap 容器中;(因为 mapmultimap 容器在插入数据时会自动的做排序操作)

需要注意的是,map 容器与 set 容器不同,map 容器是对键值进行排序,set 容器是对插入的数据进行排序;

#include <iostream>
#include <map>  //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

class MyCompare
{
public:
	bool operator()(int v1,int v2)  //利用仿函数(重载()运算符)的技术,修改map容器的排序规则
	{
		//排序规则指定为从大到小排
		return v1 > v2; 
	}
}; 

void test_1()  //map容器指定排序规则 
{
	map<int,string> m1;
	
	m1.insert(make_pair(2,"Yauge_2"));
	m1.insert(make_pair(1,"Yauge_1"));
	m1.insert(make_pair(3,"Yauge_3"));
	m1.insert(make_pair(5,"Yauge_5"));
	m1.insert(make_pair(4,"Yauge_4"));
	
	cout << "排序规则修改前:" << endl;
	
	//遍历输出打印 
	for(map<int,string>::const_iterator it=m1.begin();it!=m1.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
	
	cout << "——————————————————————" << endl;
}

void test_2()  //map容器指定排序规则
{
	map<int,string,MyCompare> m1;
	
	m1.insert(make_pair(2,"Yauge_2"));
	m1.insert(make_pair(1,"Yauge_1"));
	m1.insert(make_pair(3,"Yauge_3"));
	m1.insert(make_pair(5,"Yauge_5"));
	m1.insert(make_pair(4,"Yauge_4"));
	
	cout << "排序规则修改后:" << endl;
	
	//遍历输出打印 
	for(map<int,string,MyCompare>::const_iterator it=m1.begin();it!=m1.end();it++)
	{
		cout << "key(键值):" << (*it).first << "     value(实值):" << it->second << endl; 
	}
}

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

以上就是STL中map容器和multimap容器的一些常用接口和用法啦O(∩_∩)O。笔记中有错误的地方,欢迎指出,欢迎大家讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值