一、map简介
map是C++的一个标准容器,提供一个key到value的映射,其中key可以为字符串、数字、字符等,例如int数组也是一个映射,但是只能是int到int的映射。map有一些常用的函数如下:
构造函数:
map<Type,Type> myMap; //Type可为string、int、char等
普通函数:
myMap.insert(pair<Type,Type>(key,value));
myMap.count(key);//返回值为0、1对应无、有此元素
myMap.find(key); //返回值为迭代器,若没有此元素返回myMap.end();
myMap.erase(key);
迭代器:
map<Type,Type >::iterator myIterator;
注意事项:
myMap.begin()是容器的第0个元素,myMap.end()是容器最后一个元素的下一个元素。
序列性容器::(vector和list和deque)
erase迭代器不仅使所指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值为下一个有效的迭代器。
关联性容器::(map和set)
erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以要采用erase(iter++)的方式删除迭代器,
二、练习题目-木材仓库
题目描述
博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:
进货,格式 1 Length:在仓库中放入一根长度为 Length(不超过10^9) 的木材。如果已经有相同长度的木材那么输出Already Exist。
出货,格式 2 Length:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty。
输入格式
无
输出格式
无
输入输出样例
输入
7
1 1
1 5
1 3
2 3
2 3
2 3
2 3
输出
3
1
5
Empty
解题过程
有10000次操作且Length长度为1e9,选择map解此题较为合适,map能对key自行按升序排序。
要注意vec.begin()是容器的第0个元素,vec.end()是容器最后一个元素的下一个元素,这一步判断这个点是不是最后一个点,应该把这个点的迭代器加1再与end()做比较,而判断这个点是不是第一个点却不用先减一而是直接把这个点与begin()做比较。
if(itLat == store.end()) {
//!!!
cout << (--it)->first << endl