C++中的STL模板库的功能可谓相当强⼤。今天我们来简单说⼀下set和map的使⽤⽅法。1.pair
我们先来说⼀下pair。pair定义在头⽂件 pair 当然⾥⾯的数据类型可以改变,后⾯的变量名也可以任意改变。或者你可以使⽤make_pair来新建⼀个pair,⽐如: make_pair(s,t); 在新建pair的时候可以直接赋值,有两种⽅法,第⼀种如下: pair 就是在定义的pair的名称后⾯打上括号,⾥⾯直接把值传进去。第⼆种如下: pair 这样的话就是使⽤⼀次makepair来对pair赋初值了。 看起来很简单。这样我们就可以在STL中使⽤pair这种数据结构类型,以进⾏各种复杂的操作……⽽在向⾥⾯压⼊pair元素的时候,只要加⼀个make_pair就可以了。2.map map本⾝是键值(key)和映射值(value)的⼀个映射。其中key和value可以选择任意数据类型。(1)创建⼀个map 这⾥使⽤最简单的⼀种⽅法,就是直接定义⼀个map,在⾥⾯写上key和value的类型,再定义map的名字。 map (2)向map中添加元素 第⼀种是直接使⽤map的下标进⾏添加,就像使⽤数组⼀样。⽐如: for(int i = 1;i <= n;i++) mp[i] = i * 100; 第⼆种是使⽤insert函数,将⼀个pair元素进⾏插⼊。⽐如: for(int i = 1;i <= 10;i++) mp.insert(make_pair(i,i*100)); 以及还有许多神奇的添加⽅式,在这⾥不⼀⼀讲述了……(3)在map中查找元素 如果要直接查找元素在map中出现过多少次,那么可以使⽤count函数,⽐如: map rep(i,0,19) mp.insert(make_pair(i,i*100)); if(mp.count(1)) printf(\"Yes\\n\"); 注意这⾥的count是直接查找键值(key)。 ⽽且因为map中会⾃动对相同键值去重……所以count相当于只会告诉你这个元素是否有出现过。如果想使⽤count计算元素出现次数可以使⽤multimap。 map还有find()函数,可以返回指向所查找元素的迭代器,如果没有此元素就返回指向map尾部的迭代器。⽐如: map if(itf != mp.end()) itf->second = 20; 注意因为itf是⼀个迭代器(实际上是指针),所以我们使⽤了->,如果不愿意使⽤的话,也可以写成:(*itf).second 最暴⼒的⽅式就是直接在map中⽤迭代器遍历,⽐如这样: map for(it = mp.begin();it != mp.end();it++) printf(\"%d->%d\\n\",it->first,it->second); 因为在map中元素的地址是相连的,所以直接it++即可。如果不愿意⽤->就使⽤上⾯的写法。 还有⾮常强劲的查找⽅式,那就是直接使⽤lowerbound和upperbound。这⾥要提⼀下map⾥⾯的排序,他是⾃动按key值从⼩到⼤排序,也就是说不可以对map使⽤sort。 lowerbound和upperbound与平时在数组上的⽤法都是⼀样的,⼀般来说⽀持key值查找(value作为第⼆关键字可不可⾏我还不知道……)⼀般来讲,我们映射都是⼀⼀映射,所以key值应该都是唯⼀的,直接在key值上查找就可以了。特别的,如果lower/upperbound找不到元素的话,返回指向容器末尾的迭代器。(返回的类型如果你开了代码补全可以看到……不过很影响码速)(4)map中删除元素 删除元素⼀般来说有三种操作。第⼀种是直接使⽤erase函数往⾥⾯传实际值,⽐如: mp.erase(0); 第⼆种就是向⾥⾯传⼀个迭代器,⽐如: mp.erase(mp.begin());//显然begin函数返回的是⼀个迭代器!! 第三种就是传两个迭代器,注意这样删除的是⼀个左闭右开的区间,⽐如: map rep(i,0,19) mp.insert(make_pair(i,i)); map 这样删完之后,你会发现元素还剩15~19,(15没有被删去),⽤upperbound的话就是16~19了。 这些操作已经基本够⽤了……还有⼀个很厉害的swap。这⾥的swap函数直接交换的是两个map容器,⽽不是元素。(下⾯代码是偷来的) #include
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务