c++map、set和pair使用小技巧

最近遇到一道题(后一篇博客会说),不会用map和set的啊,只得去学一下,顺便带了pair,在这里总结。
如果有想要学详细的,请直接关掉这个页面,这里是说部分常用的东西怎么用。

map:

map就是个hash表,不用你手打的hash表。
如果hash的东西很多,要求很高,最好还是别用map。
这与map的原理有关:据WYT口胡,map会先开一定空间,等到用完了,再开,谁也不知道多了它会有多慢,所以OI时遇到较大的hash还是得手调mo值。


头文件:

#include<map>

定义:

map<type1, type2> a;

type1是hash的类型,一般是数字。字符串。
type2是一个位置携带的类型。

插入、使用、修改:


    a[type1] = type2;

直接当做数组下标用是最方便的.
至于其它的表示法一般用不上。


删除:

a.erase(type1);

其它:


    a.clear(); //清空
    a.empty(); //是否为空 
    a.size(); //返回a的元素个数

是不是很简单。
据说还有一个叫multimap的东西,关键字可以重复,由于我暂时没有想到有什么用,就不写了。


set:

set的含义是集合,set重复元素只算作一个,如果要有重复的元素,用multiset,multiset的应用比较广,如果有特殊情况,也还是用set方便。下面的讲解都以multiset为例。
set有什么用呢?我把它看作一个堆(我再也不用优先队列了),它可以非常方便的取最小值或最大值,删除,插入。时间大概是log,它在内部是用二叉树实现的。


头文件:


#include<set>

定义:

multiset <int> b;

插入:

b.insert(1);

删除:


    b.erase(1);
    b.erase(b.find(1));

删除有两种;
第一种就是第一句话,它会把集合里全部的1的删去。
如果想要删除一个,erase()的就得是地址,所以我们可以find()一个地址,然后删除。


查询:


    printf("%d %d %d", *b.begin(), *--b.end(), (*b.begin()) + (*--b.end()));

begin()是最小值,end()是最大值的下一个位置,打个–就是最后一个,如果要直接查最后一个,也可以用rbegin()。注意返回的是一个地址,所以用的时候要在前面加星号,还要注意星号的优先级,需要打上括号。

要是我们要查找第二小,可以把第一个删了,再查询最小,最后把第一个加回去。
这里提供一个黑方法,就是先找到最小地址,++地址后所对应的值就是第二小。


    multiset<int> :: iterator it;
    it = b.begin();
    printf("%d", *(++ it));

二分:
lower_bound(x)返回第一个大于等于x的元素的定位器。
upper_bound(x)返回第一个大于x的元素的定位器。
注意两个都是大于,我们可以根据它们来推小于。


    printf("%d %d\n", *b.lower_bound(1), *b.upper_bound(1));

其它:

    b.clear(); //清空
    b.empty(); //是否为空 
    b.size(); //返回b中元素的个数
    b.count(1); //返回某元素在集合中出现的次数。 

pair:

pair实际上就是c++内带的一个双关键字,应该STL都支持普通格式,不用你重新定义类型那么麻烦(我也不会)。


头文件:

#include<string>

定义:

pair<type 1, type2> c;

使用:


    c = make_pair<type1, type2>(1, 2);

make_pair返回的就是<>中规定的类型。
如果本来都是int,可以省略<>。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值