网站多久需要维护用服务器建立网站
web/
2025/9/25 16:17:33/
文章来源:
网站多久需要维护,用服务器建立网站,贵州公明建设投资咨询有限公司官方网站,wordpress安装网站说起map和set#xff0c;想必我们都学过红黑树了吧#xff0c;map和set就是红黑树的一个应用领域。它的底层就是由红黑树来实现的。下面简单说一下map和set的使用吧。
首先#xff0c;有一个栗子是这样的#xff0c;让我们统计出每种水果出现的次数。
我们会想到怎么解决…说起map和set想必我们都学过红黑树了吧map和set就是红黑树的一个应用领域。它的底层就是由红黑树来实现的。下面简单说一下map和set的使用吧。
首先有一个栗子是这样的让我们统计出每种水果出现的次数。
我们会想到怎么解决的。关于map我们知道当你插入同样的key值时它就不会将要插入的key值插入到map中。但是我们还知道map是有俩个参数的一个是插入的key值另一个value可以用来统计key值出现的次数。
关于统计水果次数的问题我们主要有以下几种方法 mapstring,int countMap;string strs[] {苹果,香蕉,橘子,苹果,苹果,香蕉};//1.从头到尾遍历看是否有数组中的值没有则插入有则使secondfor(int i 0; i sizeof(strs)/sizeof(strs[0]); i){mapstring,int::iterator it countMap.find(strs[i]);if(it ! countMap.end()){it-second;}else{countMap.insert(make_pair(strs[i],1));}}mapstring,int::iterator it1 countMap.begin();while(it1 ! countMap.end()){coutit1-first:it1-secondendl;it1;}
//2.检测插入的返回值pairmapstring,int::iterator,bool的second是否为false来确定pairmapstring,int::iterator,bool ret;for(int i 0; i sizeof(strs)/sizeof(strs[0]);i){ret countMap.insert(make_pair(strs[i],1));if(ret.second false)ret.first-second;}mapstring,int::iterator it1 countMap.begin();while(it1 ! countMap.end()){coutit1-first:it1-secondendl;it1;}
//3.直接使用map重载的[]for(int i 0; i sizeof(strs)/sizeof(strs[0]);i){countMap[strs[i]];}mapstring,int::iterator it1 countMap.begin();while(it1 ! countMap.end()){coutit1-first:it1-secondendl;it1;}
运行结果 这里需要注意的几点是 1.首先使用插入的时候是需要插入一个pair结构体因为map底层的value是一个pair结构体里边成员又有first和second因此需要使用make_pair来构造insert的参数。 2.在使用第三种方法的时候我们使用到map重载的operator[]说一下operator[]的函数: (*((this-insert(make_pair(x,T()))).first)).second 分解一下上边的operator[]的式子 this-insert(make_pair(x,T()))返回值为pairiterator,bool结构体 ((this-insert(make_pair(x,T()))).first)表示pair结构体中的first即指向一个pair结构体的迭代器此pair结构体中有key和value也即所谓的first和second (*((this-insert(make_pair(x,T()))).first)).second表示取迭代器中指向的pair的second 说到map我们还有一个multimap是用来插入冗余的值比如有相同的key值的时候对于map而言它就不会将其插入而对于multimap而言就会插入。典型的例子为字典我们英译汉的时候同一个英语单词代表着不同的意思这时multimap就会将每一个key值对应的不同的value值都会插入并且以排好序的方式显示。
1.比如map来显示字典的时候
typedef mapstring,string Dict;typedef mapstring,string::iterator DictIt;Dict dict;dict.insert(make_pair(left,左边));dict.insert(make_pair(right,右边));dict.insert(make_pair(left,剩余));DictIt it dict.begin();while (it ! dict.end()){coutit-first:it-secondendl;it;}
结果为 2.用multimap来实现字典的时候
typedef multimapstring,string Dict;typedef multimapstring,string::iterator DictIt;Dict dict;dict.insert(make_pair(left,左边));dict.insert(make_pair(right,右边));dict.insert(make_pair(left,剩余));DictIt it dict.begin();while (it ! dict.end()){coutit-first:it-secondendl;it;}
运行结果 综上所述 1map和multimap可以通过key来找value也可通过key排序 2当我们查找某个key值的时候发现有多个相同的key值此时不知道it该指向哪个pair结构体这里要说明的是它将返回中序遍历的第一个key值 验证一下
typedef multimapstring,string Dict;typedef multimapstring,string::iterator DictIt;Dict dict;dict.insert(make_pair(left,左边));dict.insert(make_pair(right,右边));dict.insert(make_pair(left,剩余));DictIt it dict.begin();it dict.find(left);dict.erase(it);it dict.begin();while (it ! dict.end()){coutit-first:it-secondendl;it;}
在这里我们找到一个key值为left的pair此时删除它后再打印一下发现得出的是比它大的value值。 说完map和multimap后与之对应的还有set和multiset。set和multiset是用来判断这个值存在或者不存在。其次也可以用来排序。还有一个特点是过滤去重。
1.检测其存在或者不存在
void TestSet()
{typedef setstring MySet;typedef setstring::iterator MySetIt;MySet myset;string strs[] {苹果,香蕉,橘子,西瓜,草莓,樱桃};for(int i 0; i sizeof(strs)/sizeof(strs[0]); i){myset.insert(strs[i]);}MySetIt it myset.begin();if(it myset.find(哈密瓜))cout哈密瓜存在endl;elsecout哈密瓜不存在endl;cout存在的其他水果为endl;it myset.begin();while(it ! myset.end()){cout*itendl;it;}
}
运行结果 2.排序和去重
typedef setint MySet;typedef setint::iterator MySetIt;MySet myset;for(int i 10; i 0; i--)myset.insert(i);myset.insert(5);MySetIt it myset.begin();while(it ! myset.end()){cout*itendl;it;}
运行结果 对于过滤来说就是如果有相同的key值它就会去掉相同的key只插入一个到set中。
这里multiset的意义和multimap差不多也是处理冗余的数据。使用方法类似。
对于map和set的底层是怎么实现的呢。它是通过写的一个红黑树。主要的区别是 里边的value_type的意义对于map来说value_type指的是一个pair的结构体结构体成员为key和value而对于set来说value_type指的是key值。 在红黑树中用了枚举来表示颜色。而在源码的红黑树中使用了bool值来代替红黑俩种颜色 我们还知道map和multimapset和multiset也有区别底层是怎么用红黑树的呢。它是插入的时候分别对红黑树的插入分为唯一插入(insert_unique)和相等插入(insert_equal)相等插入就是对冗余数据的考虑。 set的插入 map中value_type: typedef pairconst Key, T value_type; set中value_type: typedef Key value_type; set的插入 typedef pairiterator, bool pair_iterator_bool; pairiterator,bool insert(const value_type x) { pairtypename rep_type::iterator, bool p t.insert_unique(x); return pairiterator, bool(p.first, p.second);}
map的插入
pairiterator,bool insert(const value_type x)
{ return t.insert_unique(x); }
multimap的插入 iterator insert(const value_type x) { return t.insert_equal(x); }
multiset的插入 iterator insert(const value_type x) { return t.insert_equal(x);}
还可以进行相关的区间的插入删除某个位置的插入删除等操作。
小姿势
lower_bound : 用来找到比key值大的数
upper_bound : 用来找到比key值大的数
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81708.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!