map, multimap和unordered_map, unordered_multimap

ぐ巨炮叔叔 提交于 2020-04-06 19:18:30

头文件为#include<map>

map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map关联容器也是采用红黑树来实现的,插入元素的键值不允许重复,比较函数只针对元素的键值进行比较,

元素的各项数据可以通过键值搜索出来,map里面的元素都是有序的。

       键值                  映照数据

Jack 100.0
Bomi 75.5
Kate 90.5
1.map的创建

map<Element,Element> m;
注意map是要有两个数据类型的,一个是键值的数据类型,一个是映照数据的。

2.元素的插入、遍历输出和访问

map元素的插入很简单,有多种方式

通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first和 iterator->second分别代表关键字和映照的数据

所以插入的时候应该传一个pair对象

m.insert(make_pair("kate",90.5));
输出的时候应该两个数据分别输出
cout << (*it).first << "   " << (*it).second<<endl;
因为map类已经对[]操作符进行了重载,所以插入可以直接这样写

m["Jack"] = 100.0;
这样非常简单直观,但存在一个性能的问题。插入"Jack"时,先在m中查找键值为"Jack"的项,没发现,然后将一个新的对象插入m,键值是jack,映照数据为100.0。

访问也有两种方式第一种时采取m.at(键值)的方式,第二种是m[键值],第一种会进行边界检查第二种不会。

#include<bits/stdc++.h>  
using namespace std;  
int main()  
{
	map<string,double> m;
	//插入元素,按键值从小到大放入红黑树中 
	m["Jack"] = 100.0;
	m["Bomi"] = 75.5;
	m.insert(make_pair("kate",90.5));
	
	for(map<string,double>::iterator it = m.begin(); it != m.end(); it++)//遍历输出 
	{
		cout << (*it).first << "   " << (*it).second<<endl;
	}
	
	cout<<m["Bomi"]<<endl;//访问 
	cout<<m.at("Bomi")<<endl; //访问
    return 0;  
}
3.元素的删除

erase()函数。map与其他容器都一样,可以删除某个迭代器位置的元素,可以删除等于某个键值的元素,可以删除一个迭代器区间上的元素,也可以用clear()的方式清空

#include<bits/stdc++.h>  
using namespace std;  
int main()  
{
	map<string,double> m;
	//插入元素,按键值从小到大放入红黑树中 
	m["Jack"] = 100.0;
	m["Bomi"] = 75.5;
	m.insert(make_pair("kate",90.5));
	m.insert(make_pair("hhhh",-1.0));
	for(map<string,double>::iterator it = m.begin(); it != m.end(); it++)//遍历输出 
	{
		cout << (*it).first << "   " << (*it).second<<endl;
	}cout<<endl;
	
	m.erase("hhhh");
	for(map<string,double>::iterator it = m.begin(); it != m.end(); it++)//遍历输出 
	{
		cout << (*it).first << "   " << (*it).second<<endl;
	}
    return 0;  
}
4.元素的检索
find()函数,如果搜索到了就返回该键值所在的迭代器位置,否则返回end()迭代器位置。复杂度几乎为logN

#include<bits/stdc++.h>  
using namespace std;  
int main()  
{
	map<int,char> m;
	
	m[0] = 'A';
	m[1] = 'B';
	m.insert(make_pair(2,'C'));
	m.insert(make_pair(3,'D'));
	
	map<int,char>::iterator it;
	it = m.find(2);
	if(it != m.end())
		cout << (*it).first << " " << (*it).second << endl;
	else
		printf("not found it\n");
		
	it = m.find(50);
	if(it != m.end())
		cout << (*it).first << " " << (*it).second << endl;
	else
		printf("not found it\n");
    return 0;  
}
5.判断该键值是否存在或该键值元素出现次数

count()函数返回指定元素出现的次数

#include<bits/stdc++.h>  
using namespace std;  
int main()  
{
	map<int,char> m;
	
	m[0] = 'A';
	m[1] = 'B';
	
	cout << m.count(0) << endl;
	cout << m.count(3) << endl;
    return 0;  
}

多重映照容器multimap,可以类比set与multiset。

unordered_map

头文件为<unordered_map>

unordered_map和map一样都提供了一对一的关系,但是unordered_map是无序的,内部原理和哈希有关,存取较快,运行效率比map高一些,但占用内存较大。map运行效率较差,内存占用相对较小。操作与map基本相同。




发布了646 篇原创文章 · 获赞 57 · 访问量 14万+
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!