您的位置:首页 > 编程语言 > C语言/C++

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

2017-05-24 20:45 99 查看
最近遇到一道题(后一篇博客会说),不会用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,可以省略<>。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: