STL常见容器之set/multiset、map/multimap
创始人
2024-05-30 15:02:49
0

set/multiset—集合容器

  • 特点
    • 所有元素都会在插入时自动被排序
  • 本质
    • set/multiset属于关联式容器,底层结构是二叉树实现
  • set和multiset区别
    • set不可以插入重复数据,而multiset可以
    • set插入数据的同时会返回插入结果,表示插入是否成功
    • multiset不会检测数据,因此可以插入重复数据
    • set不允许容器中有复杂的元素
    • multiset允许容器中有复杂的元素
  • 构造和赋值
    • 构造
      • set < T >st
      • set(const set &st)
    • 赋值
      • set& operator=(const set &st)
  • 大小和交换
    • size()
    • empty()
    • swap(st)
  • 插入和删除
    • 原型
      • insert(elem)
      • clear()
      • erase(pos)
      • erase(beg, end)
      • erase(elem)—删除容器中值为elem的元素
  • 查找和统计
    • 对set容器中进行查找数据及统计数据
    • 原型
      • find(key)—查找key是否存在,返回该键的元素的迭代器,若不存在则返回set.end()
      • count(key)—统计key的元素个数—只有0/1两种选择
  • pair对组创建
    • 功能
      • 成对出现的数据,利用对组可以返回两个数据
    • 创建方式
      • pair p (value1, value2)
      • pair p = make_pair(value1, value2)
        #include#includeusing namespace std;void test(void){// 第一种pair Person1("zhangsan", 18);cout << " name " << Person1.first << " age " << Person1.second << endl;// 第二种pair Person2 = make_pair("lisi", 28);cout << " name " << Person2.first << " age " << Person2.second << endl;}int main(){test();return 0;}
    
  • set容器排序
    • set容器默认排序规则为从小到大,如何改变规则
    • 利用仿函数
  • set容器存放内置数据类型如何改变规则
      #include#include#includeusing namespace std;// 仿函数class myCompare{public:bool operator()(int i1, int i2){return i1 > i2;}};void myPrint(const set& st){for (set::iterator it = st.begin(); it != st.end(); it++){cout << *it << endl;}}void test(void){set st;st.insert(10);st.insert(30);st.insert(90);st.insert(40);myPrint(st);cout << "=================================" << endl;set sts ;sts.insert(10);sts.insert(30);sts.insert(90);sts.insert(40);    for (set::iterator it = sts.begin(); it != sts.end(); it++){cout << *it << endl;}}int main(){test();return 0;}
    
  • set容器存放自定义数据类型如何改变规则—必须要自定义排序规则
      #include#include#includeusing namespace std;class Person{public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}};// 仿函数class myCompare{public:bool operator()(const Person& i1, const Person& i2){return i1.m_age > i2.m_age;}};void test(void){set Infor;Person p1("zhangsan", 18);Person p2("lisi", 28);Person p3("wangwu", 20);Infor.insert(p1);Infor.insert(p2);Infor.insert(p3);for(set::iterator it = Infor.begin(); it != Infor.end(); it++){cout << "name " << it->m_name << " age " << it->m_age << endl;}}int main(){test();return 0;}
    

map/multimap容器

  • 基本概念
    • map中每个元素都是pair
    • pair中第一个元素为key,起到索引作用,第二个元素为value
    • 所有元素都会根据元素的键值自动排序
  • 本质
    • map/multimap属于关联式容器,底层结构是二叉树
  • 优点
    • 可以根据key快速找到value
  • map和multimap区别
    • map不允许容器中有重复key值元素
    • multimap允许容器中有重复key值元素
  • 构造和赋值
    • 原型
      • map< T1, T2 > mp
      • map(const map &mp)
    • 赋值
      • map& operator=(const map &mp)
      #include#includeusing namespace std;void test(void){map m;m.insert(pair(1, 10));m.insert(pair(2, 20));m.insert(pair(3, 30));for(map::iterator it = m.begin(); it != m.end(); it++){cout << "first " << it->first << " second "<< it->second << endl;}}int main(){test();return 0;}
    
  • 大小和交换
    • size()
    • empty()
    • swap(st)
  • 插入和删除
    • insert(elem)
        // 第一种m.insert(pair(1, 10));// 第二种---推荐m.insert(make_pair(2, 20));// 第三种m.insert(map::value_type(3, 30));// 第四种m[4] = 40;
      
    • clear()
    • erase(pos)
    • erase(beg, end)
    • erase(key)—删除容器中值为key的元素
  • 查找和统计
    • find(key)—找到返回迭代器,.first是key,.second是value,没找到返回m.end()
    • count(key)—返回整型有几个,只有0/1
  • map容器排序
    • map容器默认排序规则为按照key值进行从小到大排序,依然是利用仿函数可以改变排序规则
    • map< int, int, myCompare >

相关内容

热门资讯

安卓哪个系统功耗小些,揭秘哪个... 你有没有发现,手机用着用着,电池就有点不给力了?尤其是安卓手机,系统更新换代快,但功耗问题却一直让人...
免费升级安卓系统吗,畅享智能新... 亲爱的读者们,你是否也像我一样,对安卓系统的免费升级充满了好奇和期待呢?想象你的手机从老旧的系统升级...
运行安卓app的系统,系统版本... 你有没有想过,你的手机里那些运行得风生水起的安卓应用,它们究竟是在什么样的系统下翩翩起舞的呢?今天,...
安卓系统保存照片,安卓系统照片... 手机里的照片是不是越来越多,你有没有想过,这些珍贵的回忆是怎么被安卓系统保存下来的呢?今天,就让我带...
手机安卓系统会卡吗,安卓手机系... 你有没有发现,手机用久了,尤其是安卓系统,有时候会变得有点“慢吞吞”的?这不,今天就来聊聊这个话题,...
安卓系统自己安装mim,And... 你有没有发现,你的安卓手机最近有点儿“聪明”了呢?它竟然自己动手安装了MIM(Mirroring)应...
iwork10安卓系统,创新办... 你有没有发现,最近你的手机是不是变得越来越卡了?别急,别急,让我来给你介绍一款神器——iWork10...
安卓手机装deepin系统,安... 你有没有想过给你的安卓手机换换口味呢?别再局限于那些千篇一律的操作系统了,今天就来给你揭秘如何让你的...
安卓系统不收钱吗,安卓系统免费... 你有没有想过,为什么安卓系统不用你掏腰包呢?是不是觉得它就像那免费的午餐,来者不拒,享用起来毫无负担...
8848系统是安卓的,安卓生态... 你知道吗?在手机操作系统的大千世界里,有一个特别的存在,那就是8848系统。它可不是什么小角色,而是...
安卓系统 木马删不掉,屡删不绝... 安卓系统被木马盯上的那些事儿在数字化时代,手机已经成为我们生活中不可或缺的一部分。而安卓系统,作为全...
ce系统安装安卓地图,探索智能... 最近是不是觉得手机上的地图导航有点不给力?别急,今天就来给你详细说说如何给CE系统安装安卓地图,让你...
安卓4.1系统无法升级,无法升... 你有没有遇到过这种情况?手机用了好几年,系统却怎么也升级不了?别急,今天就来聊聊这个让人头疼的安卓4...
kindle如何改安卓系统,如... 亲爱的读者们,你是否也有过这样的经历:手中的Kindle电子书阅读器突然间变得有些“不按套路出牌”,...
国内深度修改安卓系统,揭秘国内... 你知道吗?在我国,有一群技术大牛正在悄悄地搞事情呢!他们竟然对安卓系统进行了深度修改,让这个全球最流...
苹果还是安卓系统快,谁更胜一筹... 你有没有想过,手机里那个小小的操作系统,竟然能决定你的使用体验?今天,咱们就来聊聊这个热门话题:苹果...
安卓导航改苹果系统,无缝切换体... 你有没有想过,把安卓导航系统换成苹果系统,会是怎样的体验呢?想象你那熟悉的地图导航,突然间换了个“脸...
安卓导航如何进系统,系统生成与... 你有没有想过,你的安卓手机导航功能竟然可以深入到系统的核心呢?没错,今天就要来跟你聊聊这个神奇的话题...
电脑上面装安卓系统,全方位概述 你有没有想过,在你的电脑上装一个安卓系统?听起来是不是有点不可思议?但你知道吗,这可不是什么天方夜谭...
苹果刷安卓虚拟系统,刷机虚拟系... 你有没有想过,你的苹果手机竟然能装上安卓的虚拟系统?听起来是不是有点不可思议?别急,今天就来带你一探...