作为STL库中的成员,map的功能也是非常强大的
MAP的使用
用途:
map,我们可以把它与数学里的映射f(x)联系到一起,对于每一个x值,都有且仅有相对应的一个映射f(x)。这样,我们已知x,就可以很方便的查询其映射。map同理,已知一个变量,可以方便的查询其所对应的映射。剩下的,好像没什么了。
使用方法:
map<数据类型1,数据类型2> 变量名;
注意:
1. 数据类型1 与 数据类型2 可以相同,也可以是自定义的结构体;
2. 若数据类型1 为自定义的结构体,需要重载一下比较运算符。
3. 数据类型1 为键值,数据类型2 为映射。
4. map可看做一个”不定长映射”,当做映射的vector用即可。
将结构体作为键值的方法如下:
struct Point
{
int x,y;
bool operator < (const Point& a) const
{
if(x!=a.x) return x<a.y;
else return y<a.y;
}
};
map<Point,int> number;
int main()
{
Point a={1,2};
int b=1;
number[a]=b; //赋值;
cout<<number[a];//调用映射;
}
这样,就可以将结构体作为键值了,Point指向int。
注意:
第四行最后一个const !一!定!要!写!否则就会报错,无法定义。
具体使用方法,当做数组用(如代码所示),其他数据类型的映射同理;
有关map的函数:
(以映射number为例):
number.size() ——— 返回元素数目
number.empty() —— 判断是否为空(空返回ture)
number.clear() ——— 清空所有元素
number.erase() ———删除元素(键值)
number.find() ———查询()里的值(返回迭代器)
map<数据结构1,数据结构2>::iterator 指针名——定义一个迭代器
swap()————交换两个map
number.upper_bound()————返回()里的元素位置的下一个位置(迭代器)
number.lower_bound()————返回()里的元素位置(迭代器)
number.max_size()————返回number函数的最大容量
number.insert(pair<数据类型1,数据类型2>(键值,映射))——插入元素
(使用时,pair里的数据类型应与number相同,倒不如直接开一个映射方便)
number.count()————返回()里的元素的出现次数(也就意味着最高为一,也就是判断是否存在这样的有映射的元素)
number.equal_range()————返回()里的元素的lower_bound迭代器(first访问)和upper_bound迭代器(second访问)。
代码:
pair<map<int , int>::iterator,map<int,int>::iterator> top; //top是一个pair类型,存放迭代器。
top=number.equal_range();//top赋值
//这里以输出代替访问,原理一样的。
cout<<top.first->first<<' '<<top.first->second;
//这个就是low_bound();
cout<<top.second->first<<' '<<top.second->second;
//这个就是upper_bound();
number.begin()————返回number的头部的迭代器
number.end()————返回number的尾部的迭代器
还有两个函数:number.rbegin() 和 number.rend();他们俩看起来是不是很眼熟,和number.begin()和number.end()的作用差不多,可以用来遍历map
,具体用法如下:
map<int ,int >number;
map<int ,int >::iterator top;
map<int ,int >::reverse_iterator heap;
for(top=number.begin();top!=number.end();top++)
cout<<top->first<<' '<<top->second<<"\n";
for(heap=number.rbegin();heap!=number.rend();heap++)
cout<<heap->first<<' '<<heap->second<<"\n";
首先,“::iterator top”定义了一个正向的迭代器,名为top,可以从用来装载函数返回的迭代器从而进行访问(不能直接访问,只能用循环查找)
“::reverse_iterator heap”定义了一个逆向迭代器,名为heap,和正向迭代器出不多,但二者区别为:正向迭代器从map头开始,结果为从头访问到尾;而逆向迭代器则从尾访问到头。
还有:这里的“first”表示键值,而“second”表示映射。而“->”代表访问指针,可用来访问所指的目标,这里可看做:“*heap.first”和“*heap.second”,是不是好理解些?
number.value_comp()()————这个说起来比较麻烦,但我还是要说:
第一个()表示它是个函数,仅此而已;
第二个()用来“装”被比较的部分。
注意:第二个()里只能装指针,不能装迭代器。
代码:
{
map<int , int >number;
pair<int,int> i=*c.begin();
map<int,int>::iterator m=c.end();
cout<<c.value_comp()(i,*m);
两种解决方式:
1.用pair: 定义一个同类型的pair变量来存放指针;
2.map一个迭代器,比较的时候用指针。
3.STL库里所有的比较都是小于比较。
详情见上代码。
特殊说明:指针可以用”*迭代器”表示,这样也可以用find()函数具体查询啦。
number.key_comp——用法和楼上的一样。
好了,map的用法就介绍这么多,至少常用的都说的差不多了,所以,结束。
———end.