map, multimap和unordered_map, unordered_multimap

头文件为#include

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

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

       键值                  映照数据

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

map 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<
因为map类已经对[]操作符进行了重载,所以插入可以直接这样写

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

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

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

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

#include  
using namespace std;  
int main()  
{
	map 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::iterator it = m.begin(); it != m.end(); it++)//遍历输出 
	{
		cout << (*it).first << "   " << (*it).second<::iterator it = m.begin(); it != m.end(); it++)//遍历输出 
	{
		cout << (*it).first << "   " << (*it).second<
4.元素的检索
find()函数,如果搜索到了就返回该键值所在的迭代器位置,否则返回end()迭代器位置。复杂度几乎为logN

#include  
using namespace std;  
int main()  
{
	map m;
	
	m[0] = 'A';
	m[1] = 'B';
	m.insert(make_pair(2,'C'));
	m.insert(make_pair(3,'D'));
	
	map::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  
using namespace std;  
int main()  
{
	map 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和map一样都提供了一对一的关系,但是unordered_map是无序的,内部原理和哈希有关,存取较快,运行效率比map高一些,但占用内存较大。map运行效率较差,内存占用相对较小。操作与map基本相同。


你可能感兴趣的:(【STL库学习】)