STL——map的使用

作为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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值