范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

CSTL深入理解关联容器multimap和map及其查找操作

  关联容器map和multimap为了实现接近于logn的查找(二分查找)效率,将一维的数据组织成二维的树型逻辑结构(红黑树做为底层逻辑结构)。由此,为了维护其元素有序结构,其增加元素的成员函数是insert(),而不是序列容器的push_back()或list、deque容器的push_front()。
  关联容器multimap是一个key与多个value的映射关系。
  关联容器map是一个key与一个value的映射关系。
  因为map一一映射的特性,所以有额外的成员函数at()和重载操作符operator[]。
  classification
  function name
  map
  multi_map
  constructor
  map::map
  multimap::multimap
  destructor
  map::~map
  multimap::~multimap
  member functions
  at
  N/A
  begin
  cbegin
  cend
  clear
  count
  crbegin
  crend
  emplace
  emplace_hint
  empty
  end
  equal_range
  erase
  find
  get_allocator
  insert
  key_comp
  lower_bound
  max_size
  operator=
  operator[]
  N/A
  rbegin
  rend
  size
  swap
  upper_bound
  value_comp
  non-member overloads
  relational operators
  swap
  1 multimap的单值查找查找          iterator find (const key_type& k); const_iterator find (const key_type& k) const;
  demo:#include  #include   int main () {   std::multimap mymm;    mymm.insert (std::make_pair("x",10));   mymm.insert (std::make_pair("y",20));   mymm.insert (std::make_pair("z",30));   mymm.insert (std::make_pair("z",40));    std::multimap::iterator it = mymm.find("x");   mymm.erase (it);   mymm.erase (mymm.find("z"));    // print content:   std::cout << "elements in mymm:" << " ";   std::cout << "y => " << mymm.find("y")->second << " ";   std::cout << "z => " << mymm.find("z")->second << " ";    return 0; } /*Output: elements in mymm: y => 20 z => 40 */2 multimap的多值查找
  2.1 使用成员函数lower_bound()和upper_bound()          iterator lower_bound (const key_type& k); const_iterator lower_bound (const key_type& k) const;           iterator upper_bound (const key_type& k); const_iterator upper_bound (const key_type& k) const;
  demo:#include  #include   int main () {     std::multimap mymultimap;     std::multimap::iterator it,itlow,itup;          mymultimap.insert(std::make_pair("a",10));     mymultimap.insert(std::make_pair("b",121));     mymultimap.insert(std::make_pair("c",1001));     mymultimap.insert(std::make_pair("c",2002));     mymultimap.insert(std::make_pair("d",11011));     mymultimap.insert(std::make_pair("e",44));          itlow = mymultimap.lower_bound ("c");  // itlow points to b     itup = mymultimap.upper_bound ("c");   // itup points to e (not d)          // print range [itlow,itup):     for (it=itlow; it!=itup; ++it)         std::cout << (*it).first << " => " << (*it).second << " ";     getchar();     return 0; } /*output: c => 1001 c => 2002 */
  2.2 使用成员函数equal_range()template  pair equal_range (ForwardIterator first, ForwardIterator last, const T& val) {     ForwardIterator it = std::lower_bound (first,last,val);     return std::make_pair ( it, std::upper_bound(it,last,val) ); }
  equal_range()返回一对起始位置和终点位置的迭代器(pair类型),可以使用一个迭代器指向返回的pair的first和second。Associative container function equal_range() returns a pair containing the results a lower_bound and an upper_bound operation.#include  #include   int main () {     std::multimap mymm;          mymm.insert(std::make_pair("x",50));     mymm.insert(std::make_pair("y",100));     mymm.insert(std::make_pair("y",150));     mymm.insert(std::make_pair("y",200));     mymm.insert(std::make_pair("z",250));     mymm.insert(std::make_pair("z",300));          for (char c="x"; c<="z"; c++)     {         std::cout << "There are " << mymm.count(c) << " elements with key " << c << ":";         std::multimap::iterator it;         for (it=mymm.equal_range(c).first; it!=mymm.equal_range(c).second; ++it)             std::cout << " " << (*it).second;         std::cout << " ";     }     getchar();     return 0; } /* Output:  There are 1 elements with key x: 50 There are 3 elements with key y: 100 150 200 There are 2 elements with key z: 250 300 */
  另一种写法:#include  #include   int main () {     std::multimap mymm;          mymm.insert(std::pair("a",10));     mymm.insert(std::pair("b",20));     mymm.insert(std::pair("b",30));     mymm.insert(std::pair("b",40));     mymm.insert(std::pair("c",50));     mymm.insert(std::pair("c",60));     mymm.insert(std::pair("d",60));          std::cout << "mymm contains: ";     for (char ch="a"; ch<="d"; ch++)     {         std::pair ::iterator, std::multimap::iterator> ret;         ret = mymm.equal_range(ch);         std::cout << ch << " =>";         for (std::multimap::iterator it=ret.first; it!=ret.second; ++it)             std::cout << " " << it->second;         std::cout << " ";     }     getchar();     return 0; } /*output: mymm contains: a => 10 b => 20 30 40 c => 50 60 d => 60 */3 std::map::find & count          iterator find (const key_type& k); const_iterator find (const key_type& k) const; size_type count (const key_type& k) const;
  demo:#include  #include   int main () {     std::map mymap;     std::map::iterator it;          mymap["a"]=50;     mymap["b"]=100;     mymap["c"]=150;     mymap["d"]=200;          it = mymap.find("b");     if (it != mymap.end())         mymap.erase (it);          // print content:     std::cout << "elements in mymap:" << " ";     std::cout << "a => " << mymap.find("a")->second << " ";     std::cout << "c => " << mymap.find("c")->second << " ";     std::cout << "d => " << mymap.find("d")->second << " ";     if (mymap.count("e")>0)         std::cout << "e => " << mymap.find("e")->second << " ";     else         std::cout << "e not exist! ";     getchar();     return 0; } /*output: elements in mymap: a => 50 c => 150 d => 200 e not exist! */4 std::map::equal_rangepair equal_range (const key_type& k) const; pair                     equal_range (const key_type& k);
  demo:#include  #include   int main () {   std::map mymap;    mymap["a"]=10;   mymap["b"]=20;   mymap["c"]=30;    std::pair::iterator,std::map::iterator> ret;   ret = mymap.equal_range("b");    std::cout << "lower bound points to: ";   std::cout << ret.first->first << " => " << ret.first->second << " ";    std::cout << "upper bound points to: ";   std::cout << ret.second->first << " => " << ret.second->second << " ";    return 0; } /*output: lower bound points to: "b" => 20 upper bound points to: "c" => 30 */5 std::map::lower_bound & upper_bound      iterator lower_bound (const key_type& k); const_iterator lower_bound (const key_type& k) const;           iterator upper_bound (const key_type& k); const_iterator upper_bound (const key_type& k) const;
  demo:#include  #include   int main () {   std::map mymap;   std::map::iterator itlow,itup;    mymap["a"]=20;   mymap["b"]=40;   mymap["c"]=60;   mymap["d"]=80;   mymap["e"]=100;    itlow=mymap.lower_bound ("b");  // itlow points to b   itup=mymap.upper_bound ("d");   // itup points to e (not d!)    mymap.erase(itlow,itup);        // erases [itlow,itup)    // print content:   for (std::map::iterator it=mymap.begin(); it!=mymap.end(); ++it)     std::cout << it->first << " => " << it->second << " ";    return 0; } /*output: a => 20 e => 100 */6 std::map::at (C11)
  成员函数at有边界检查,当然也有性能损耗。          mapped_type& at (const key_type& k); const mapped_type& at (const key_type& k) const;
  demo:#include  #include  #include   int main () {     std::map mymap = {         { "alpha", 0 },         { "beta", 0 },         { "gamma", 0 } };              mymap.at("alpha") = 10;     mymap.at("beta") = 20;     mymap.at("gamma") = 30;          for (auto& x: mymap) {         std::cout << x.first << ": " << x.second << " ";     }     std::cout <<  mymap.at("alpha") << " ";     std::cout <<  mymap.at("empty") << " "; // std::cout <<  mymap.at("alpha") << " ";     return 0; } /*output: alpha: 10 beta: 20 gamma: 30 10 terminate called after throwing an instance of "std::out_of_range"   what():  map::at */7 std::map::operator[]
  重载操作符operator[]没有边界检查,当然也就避免了性能损耗。mapped_type& operator[] (const key_type& k);
  demo:#include  #include  #include   int main () {     std::map mymap = {         { "alpha", 0 },         { "beta", 0 },         { "gamma", 0 } };              mymap["alpha"] = 10;     mymap["beta"] = 20;     mymap["gamma"] = 30;          for (auto& x: mymap) {         std::cout << x.first << ": " << x.second << " ";     }     std::cout <<  mymap["alpha"] << " ";     std::cout <<  mymap["empty"] << " "; // 0     return 0; } /*output: alpha: 10 beta: 20 gamma: 30 10 0 */
  ref
  http://www.cplusplus.com/reference/map/multimap/count/
  http://www.cplusplus.com/reference/map/multimap/equal_range/

初学剪辑,准备入手一款拍视频比较给力的手机,有吗?感谢邀请初学剪辑,准备入手一款拍视频比较给力的手机,有吗?题主问题的核心是初学剪辑,准备入手一款拍摄视频比较给力的手机,有吗?这样的手机当然是有的,因为首先我们要知道拍摄视频最重要双活数据中心给您的数据上双保险数字化时代,越来越多用户采用私有云架构,自建数据中心。随之而来的便是业务连续性和数据安全挑战。如何搭建一个高可靠高安全的IT基础架构,确保业务连续不中断,数据安全不丢失?大兆科技配厉害了!2021年拍照最佳的6款手机来袭镜头与颜值双重爆表哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您虽然有些人在选择新手机时将性能性价比或手机续航能力放在首位,但对许多人来说,手机的拍照性能决定了它是否值得选择。在选择之前了解外贸新人怎样快速开发客户?1,欧洲人懒。因此不要指望在什么阿卝里巴巴,或什么B2B网站的注册,发布信息。那种东西只有欧洲的一些太过于精明和太了解中国的中间商才用。因为他们知道。凡是用这个的价格会压的超低。只央行数字货币发行能否直接导致币圈雪崩?完全不会,这就不是一种东西,好多人只看到数字货币是一种虚拟币,完全不知道几种主流数字货币已经是一个应用生态了,可能我这样说不了解数字货币的人还是不懂,我举个简单的例子,你可以把现在MacbookAir(M1)16256和MacbookPro(M1)8256,该怎么选?先看看M1芯片的MacBookAir和MacbookPro13的区别吧,简单来说二者的主要区别在于M1芯片规格,屏幕,触控栏,续航,尺寸和散热。芯片部分,虽然二者都是M1芯片,但是HarmonyOS2上手快评似曾相识却又处处不同6月2日的HarmonyOS2及华为全场景新品发布会上,大家期待已久的HarmonyOS2正式发布,华为Mate40系列的用户已经可以申请体验这一全新的操作系统了。相信很多网友都很30万高端手机只卖出1万!华为退了,国产手机的遮羞布也没了贸易犹如血液,应该循环流通。德莱顿国内一家媒体昨日发文没有华为国产机还是干不过苹果,有企业高端机备货30万卖出1万,直言米OV争做国产高端手机之王,但消费者用钱把票投给了苹果,此前趁现在入手最划算,比拼618,手机降价一个比一个狠一年一度的618又到啦!今年的618大促来得比以往更早一些,从今天凌晨开始,各品牌围绕这场上半年最大电商购物节的促销大战就已经打响,不知道各位差友都剁手了没?网上有句话怎么说来着?华为WATCH3体验预装鸿蒙系统,提前预定年度旗舰智能手表?可能是目前最接近腕上助手的智能手表。2019年华为发布HarmonyOS之后,何时会落地到产品端,便成为了外界普遍比较关心的一件事情。没有让大家等太久,6月2日举办的全场景新品发布618大战开启,苏宁宝宝节多维度跨界玩转大促随着618期中考来临,电商平台们纷纷使出浑身解数应对。其中苏宁凭借一场六一宝宝节脱颖而出,郭京飞关晓彤贾乃亮等百大明星齐聚创新直播带货。打破营销套路,打破传统电商促销节奏,以开放的
三星GalaxyS21Ultra陪你走过的一年,拍照技术一直在线一年又一年,过得太快了,记得去年这个时候还在纠结有那么多东西S和N还不能拍呢,今年的这个时候已经什么都解决了。以前拍很多东西是需要受制于机器的算法现在,一切都可以听自己的了。EXI荣耀X30上手评测快充续航实力超顶,千元档旗舰体验近期荣耀发布了8年诚意之作荣耀X30,小编在发布会后第一时间上手了真机,荣耀X30主打快充长续航,且超窄边框全视屏的确是目前的天花板,无论是拿来看剧打游戏还是日常使用,视觉方面都是CBrother脚本语言HttpEasy框架接口修改,支持监听多个端口昨晚在群里聊到是否把while(1)Sleep(1000)这样不让程序退出的语句封装进httpserver里,我当时给出的答案是如果封装进去了一个进程监听多个端口无法实现,让使用h华为鸿蒙新能源汽车上线,国内新能源汽车品牌应该深思视频加载中华为又偷偷放大招了!华为首款鸿蒙新能源汽车已经开始在全国500家门店展示了,明年一月二十正式开始试驾!千万别着急划走,我今天要说的可不是华为汽车,而是蔚来汽车!不知道大家开源一个轻量级Java应用开发框架。更快更小更自由一开源项目简介Solon,是一个轻量级的应用开发框架。更快更小更自由!二功能概述支持JDK8主框架0。1Mb组合不同的插件应对不同需求方便定制快速开发。克制简洁开放HttpWebS中国学者提出拍赫兹通信新框架助力未来6G发展来源科技日报我学者提出拍赫兹通信新框架助力未来6G发展科技日报讯(记者吴长锋)记者近日从中国科学技术大学获悉,该校徐正元教授领衔的联合团队,日前在国际学术期刊数字通信与网络(英文)任正非预言成真!余承东传来鸿蒙好消息,与iOS安卓三足鼎立文球子审核子扬校对知秋12月中旬,华为对外宣布,百机升级计划已经完成,这也就意味着,华为已经实现对现有手机的鸿蒙系统升级。同时,在12月23日华为冬季新品发布会上,余承东公布了鸿蒙Validated校验在springboot框架中的应用(教程版)各位朋友大家好,我是奋斗的小强001,本期更新的内容是Validated校验在springboot框架中的应用。前言bs系统中对http请求数据的校验多数在客户端进行,这也是出于简国产自研芯片又增加一颗,小米12Pro将首次搭载现在的手机市场竞争越来越激烈,手机厂商们对于技术创新越来越重视,能让消费者喜爱的手机也必然有一定的技术优势。就拿小米来说,它在技术研发上的投入一直很大,而且还涉足了难度非常高的芯片任正非之误痛失李一男!港湾也是唯一让华为伤筋动骨的内讧老方说惨胜如败。这是任正非和孙亚芳等华为高层对华为vs港湾之战的定性,由此可见港湾对华为的威胁之大,李一男对华为之重要。提到李一男,不得不提CC08华为数字交换机。CC有两个含义一互联网大厂裁员互联网大厂是中国经济的金丝雀。傲娇的金丝雀对风险敏感,而大厂裁员发出了一些信号。近日,爱奇艺大裁员,比例达到20至40之间,为该公司史上最大规模的一轮裁撤。字节跳动的教育及游戏板块