acm的STL容器之Map篇
Posted vskendo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了acm的STL容器之Map篇相关的知识,希望对你有一定的参考价值。
1.对map的简单介绍
Map是STL的一个关联容器,它提供一对一(其中第一个称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据处理能力。
这里说下map内部数据的组织,map内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。
2.map功能介绍
map利用k-v,即Key - value。key 和 value可以声明成任意你需要的类型。
查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
map的常用操作:
快速插入Key -Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
3.map的声明
需要声明头文件,并使用命名空间std。
#include<iostream>
#include<map>
using namespace std;
声明一个map。根据个人命名规范习惯,推荐int-int类型的map叫 iimap,如果是<int,string>类型的推荐叫 ismap
一半声明了map后,为了以后查询、遍历、删除等方便,我们顺便声明iterator
map<int,int> iimap;
map<int,int>::iterator iter;
4.数据的插入、删除、数量、清空
先不写查询,放在遍历那里一起写。
有2种方法可以向map中填入数据,第一种是用类似数组的方式。
ismap[1] = "hello";
这样,字符串“hello”的key就是1.
还有一种是
iimap.insert(pair<int,int>(a,b));
(我这里使用的第一个是<int,string>,第二个是<int,int>)
这两种方式有区别,第一种数组的方法可以覆盖重复key值的value,第二种插入时若key已经存在,则插入无效。
当然,第二种方法可以用pair来查询数据是否插入成功(acm中通常不使用),这里给代码,不作详解。
1 map<int, string> ismap; 2 3 pair<map<int, string>::iterator, bool> Insert_Pair; 4 5 Insert_Pair = ismap.insert(pair<int, string>(1, "hello")); 6 7 if(Insert_Pair.second == true) 8 9 cout<<"Insert Successfully"<<endl; 10 11 else 12 13 cout<<"Insert Failure"<<endl;
数据数量查询(map中数据样本多少)
iimap.size();
清空map的操作
iimap.clear();
从map中删除特定元素
移除某个map中某个条目用erase()
该成员方法的定义如下:
iterator erase(iterator it);//通过一个条目对象删除 iterator erase(iterator first,iterator last)//删除一个范围 size_type erase(const Key&key);//通过关键字删除
刚才提到的clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());
这里只演示删除某key值和其对应的value
1 map<int, string>::iterator iter;
2 //第一种,通过iter删除
3 iter = ismap.find(1);
4
5 ismap.erase(iter);
6
7 //第二种,直接在erase()的括号中填入key,可以不用n,只是删除不管返回值
8 //这样的话会有一个返回值,这里用n来接收,删除了会返回1,否则返回0
9 int n = ismap.erase(1);
5.数据的查询和遍历
刚才的移除元素已经用到了iterator,接下来我们都要用。通常用第二种方法。
查找一个元素是否存在的两种方式:
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置。
由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
由于比赛中用得比较少,大家自行体会,代码就不放了。
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,
分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
因为我们已经声明过iterator了,所以就方便很多,直接用iter=ismap.find(index)来查找,然后使用一个if语句来判断。
1 iter = ismap.find(1); 2 3 if(iter != ismap.end()) 4 5 cout<<"Find, the value is "<<iter->second<<endl; 6 7 else 8 9 cout<<"Do not Find"<<endl;
个人感觉c++的容器搞得没java好,比较麻烦,好怀念containKey()这种操作。
接下来讲遍历,也是用iter就可以了。
(待完善)
以上是关于acm的STL容器之Map篇的主要内容,如果未能解决你的问题,请参考以下文章