map的用法.docx
- 文档编号:5444122
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:12
- 大小:22.37KB
map的用法.docx
《map的用法.docx》由会员分享,可在线阅读,更多相关《map的用法.docx(12页珍藏版)》请在冰豆网上搜索。
map的用法
#include
#include
#include
#include
usingnamespacestd;
voidmain()
{
map
vector
vector
vector
for(inti=0;i<5;i++)
{
vect1.push_back(i);
vect2.push_back(i);
vect3.push_back(i);
}
mi.insert(make_pair("dog",vect1));
mi.insert(make_pair("cat",vect2));
mi.insert(make_pair("fish",vect2));
map
:
iteratoriter=mi.begin();
for(;iter!
=mi.end();iter++)
{
vector
:
iteratorit=iter->second.begin();
for(;it!
=iter->second.end();it++)
{
cout<<*it<<"\t";
}
cout<<"\n";
}
}
MAP使用方法
2010-04-1515:
42:
44
一、map的说明
1头文件
#include
2定义
map
或者是typedefmap
MY_MAPmy_Map;
3插入数据
(1)my_Map["a"]=1;
(2)my_Map.insert(map
:
value_type("b",2));
(3)my_Map.insert(pair
(4)my_Map.insert(make_pair("d",4));
4查找数据和修改数据
(1)inti=my_Map["a"];
my_Map["a"]=i;
(2)MY_MAP:
:
iteratormy_Itr;
my_Itr.find("b");
intj=my_Itr->second;
my_Itr->second=j;
不过注意,键本身是不能被修改的,除非删除。
5删除数据
(1)my_Map.erase(my_Itr);
(2)my_Map.erase("c");
还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。
6迭代数据
for(my_Itr=my_Map.begin();my_Itr!
=my_Map.end();++my_Itr){}
7其它方法
my_Map.size()返回元素数目
my_Map.empty()判断是否为空
my_Map.clear()清空所有元素
可以直接进行赋值和比较:
=,>,>=,<,<=,!
=等等
更高级的应用查帮助去吧,^_^;
二\map的举例
要求:
将mymap中itemstruct的a大于100的项删除
structitemstruct
{
inta;
charb[20];
};
map
解答1:
#include
#include
#include
usingnamespacestd;
typedefstructitemstruct
{
inta;
charb[20];
}itemS;
itemSs[4]={{102,"what"},
{33,"hello"},
{198,"world"},
{45,"c++"}
};;
intmain()
{
map
stringstr[4]={"1st","2nd","3rd","4th"};
for(inti=0;i<4;i++)
{
mymap.insert(make_pair(str[i],s[i]));
}
map
:
iteratorit;
for(it=mymap.begin();it!
=mymap.end();it++)
{
if(it->second.a>100){
i=mymap.erase(it);----->正确
mymap.erase(it);----->it失效..
}
}
//first是Key,second是value;
for(it=mymap.begin();it!
=mymap.end();it++)
{
cout< } system("pause"); return0; } 解答2: #include #include #include #include #include usingnamespacestd; structitemstruct { inta; charb[20]; itemstruct(intt,char*str) { a=t; strcpy(b,str); } }; intmain() { map mymap.insert(make_pair("a",itemstruct(10,"hanzhou"))); mymap.insert(make_pair("ab",itemstruct(20,"fuzhou"))); mymap.insert(make_pair("abc",itemstruct(30,"zhengzhou"))); mymap.insert(make_pair("abcd",itemstruct(200,"wuhan"))); mymap.insert(make_pair("abcde",itemstruct(150,"kunming"))); mymap.insert(make_pair("abcdef",itemstruct(50,"xiamen"))); map : iteratorit=mymap.begin(); while(it! =mymap.end()) { if((it->second).a>100)mymap.erase(it++); elseit++; } it=mymap.begin(); while(it! =mymap.end()) { cout< it++; } system("PAUSE"); return0; } 解答3: for(map : iteratori=mymap.begin();i! =mymap.end();) { if(i->second.a>100) i=mymap.erase(i); else ++i; } 解答4: VC6中编译map编译出错的解决方法 Warningssimilartothefollowingaregeneratedevenifyouusethewarningpragmatodisablethewarning: warningC4786: 'std: : rb_tree : less : TransClosureNode,CAiSpanningTree : less : TransClosureNode,std: : ident : less : TransClosureNode,CAiSpanningTree : less : TransClosureNode>,std: : less : less : TransClosureNode>>': identifierwastruncatedto'255'charactersinthedebuginformation C++基础与教程【map型关联容器】 (2010-11-0420: 29: 18) 转载▼ 标签: 容器 类型 对象 map型 it 分类: Programme 关联容器和顺序容器的本质差别在于: 关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 两个基本的关联容器类型是mapset。 map的元素以键-值(key-value)对的形式组织: 键用作元素在map中的索引,而值则表示所存储和读取的数据。 set仅包含一个键,并有效地支持关于某个键是否存在的查询。 set和map类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素。 如果一个键必须对应多个实例,则需使用multimap或multiset,这两种类型允许多个元素拥有相同的键。 关联容器类型: map关联数组: 元素通过键来存储和读取。 set大小可变的集合,支持通过键实现的快速读取。 multimap支持同一个键多次出现的map类型。 multiset支持同一个键多次出现的set类型。 pairs类型提供的操作: pair pair 。 make_pair(v1,v2)以v1和v2值创建一个新pair对象,其元素类型分别是v1和v2的类型。 p1 如果p1.first (p2.first p1==p2如果两个pair对象的first和second成员依次相等,则这两个对象相等。 p.first返回p中名为first的(公有)数据成员 p.second返回p的名为second的(公有)数据成员 初始化: pair pair pair 可在定义时为每个成员提供初始化式: pair 可考虑利用typedef简化其声明: typedefpair Authorproust("Marcel","Proust"); Authorjoyce("James","Joyce"); 访问pairs数据成员: stringfirstBook; //accessandtestthedatamembersofthepair if(author.first=="James"&&author.second=="Joyce") firstBook="StephenHero"; make_pair函数: pair stringfirst,last; while(cin>>first>>last){ //generateapairfromfirstandlast next_auth=make_pair(first,last); //processnext_auth... } 顺序容器和关联容器公共的操作包括下面的几种: 前三种构造函数: C C //bandeareiteratorsdenotingasequence C 关联容器不能通过容器大小来定义,因为这样的话就无法知道键所对应的值是什么。 •关系运算: <,>,==,参考string类。 • begin、end、rbegin和rend操作。 •类型别名(typedef)。 注意,对于map容器,value_type并非元素的类型,而是描述键及其关联值类型的pair类型。 •swap和赋值操作。 但关联容器不提供assign函数。 •clear和erase操作,但关联容器的erase运算返回。 •容器大小的操作。 但resize函数不能用于关联容器。 “容器元素根据键的次序排列”在迭代遍历关联容器时,我们可确保按键的顺序的访问元素,而与元素在容器中的存放位置完全无关。 map适用于电话簿、字典等,键-值对应,set是键的集合,适用于比如黑名单。 map是键-值对的集合。 map类型通常可理解为关联数组(associativearray): 可使用键作为下标来获取一个值,正如内置数组类型一样。 定义map对象: 必须分别指明键和值的类型(valuetype): //countnumberoftimeseachwordoccursintheinput map 这个语句定义了一个名为word_count的map对象,由string类型的键索引,关联的值则int型。 map的构造函数: map map map 元素的类型必须能转换为pair 在使用关联容器时,它的键不但有一个类型,而且还有一个相关的比较函数。 默认情况下,标准库使用键类型定义的<操作符来实现键(keytype)的比较。 对于键类型,唯一的约束就是必须支持<操作符,至于是否支持其他的关系或相等运算,则不作要求。 value_type是存储元素的键以及值的pair类型,而且键为const。 例如,word_count数组的value_type为pair map类定义的类型: map : key_type 在map容器中,用做索引的键的类型。 map : mapped_type 在map容器中,键所关联的值的类型。 map : value_type 一个pair类型,它的first元素具有constmap : key_type类型,而second元素则为map : mapped_type类型。 value_type是pair类型,它的值成员可以修改,但键成员不能修改。 map迭代器进行解引用将产生pair类型的对象。 例程: //getaniteratortoanelementinword_count map : iteratormap_it=word_count.begin(); //*map_itisareferencetoapair cout< cout<<""< map_it->first="newkey";//error: keyisconst ++map_it->second;//ok: wecanchangevaluethroughaniterator 对迭代器进行解引用将获得一个pair对象,它的first成员存放键,为const,而second成员则存放值。 例程: map //insertdefaultinitialzedelementwithkeyAnna;thenassign1 toitsvalue word_count["Anna"]=1; 将发生以下事情: 1.在word_count中查找键为Anna的元素,没有找到。 2.将一个新的键-值对插入到word_count中。 它的键是conststring类型的对象,保存Anna。 而它的值则采用值初始化,这就意味着在本例中值为0。 3.将这个新的键-值对插入到word_count中。 4.读取新插入的元素,并将它的值赋为1。 用下标访问不存在的元素将导致在map容器中添加一个新元素,它的键即为该下标值。 例程: //countnumberoftimeseachwordoccursintheinput map stringword; while(cin>>word) ++word_count[word]; 这段程序创建一个map对象,用来记录每个单词出现的次数。 while循环每次从标准输入读取一个单词。 如果这是一个新的单词,则在word_count中添加以该单词为索引的新元素。 如果读入的单词已在map对象中,则将它所对应的值加1。 map容器提供的insert操作: m.insert(e) e是一个用在m上的value_type类型的值。 如果键(e.first)不在m中,则插入一个值为e.second的新元素;如果该键在m中已存在,则保持m不变。 该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。 m.insert(beg,end) beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。 对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m,返回void类型。 m.insert(iter,e) e是一个用在m上的value_type类型的值。 如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。 返回一个迭代器,指向m中具有给定键的元素。 word_count.insert(map : value_type("Anna",1)); 或使用typedef: typedefmap : value_typevalType; word_count.insert(valType("Anna",1)); 使用insert重写的单词统计程序: //countnumberoftimeseachwordoccursintheinput map while(cin>>word){ //insertselementwithkeyequaltowordandvalue1; //ifwordalreadyinword_count,insertdoesnothing pair : iterator,bool>ret=word_count.insert(make_pair(word,1)); if(! ret.second)//wordalreadyinword_count ++ret.first->second;//incrementcounter } 对于每个单词,都尝试insert它,并将它的值赋1。 if语句检测insert函数返回值中的bool值。 如果该值为false,则表示没有做插入操作,按word索引的元素已在word_count中存在。 此时,将该元素所关联的值加1。 使用下标存在一个很危险的副作用: 如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。 不修改map对象的查询操作: m.count(k)返回m中k的出现次数。 m.find(k)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- map 用法