头文件为#include<map>
map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map关联容器也是采用红黑树来实现的,插入元素的键值不允许重复,比较函数只针对元素的键值进行比较,
元素的各项数据可以通过键值搜索出来,map里面的元素都是有序的。
键值 映照数据
Jack | 100.0 |
Bomi | 75.5 |
Kate | 90.5 |
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基本相同。
来源:oschina
链接:https://my.oschina.net/u/4417091/blog/3216495