所有元素都会在插入时自动被排序

本质:

set/multiset属于关联式容器,底层结构是用二叉树实现

set和multiset区别:

set不允许容器中有重复的元素

multiset允许容器中有重复的元素

构造:

set<T>st;
set(const set& st);

赋值:

set& operator=(cosnt set& st);

void print(set<int>&s)
{for(set<int>::iterator it=s.begin();it!=s.end();it++){cout<<*it<<" ";}cout<<endl;
}int main()
{set<int>s1;//插入数据,只有insert方式//set容器不允许插入重复值s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);s1.insert(50);//遍历容器print(s1);set<int>s2(s1);print(s2);
}

插入数据,只有insert方式

set大小和交换

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容

set不可以重新指定大小

    set<int>s1;//插入数据,只有insert方式//set容器不允许插入重复值s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);s1.insert(50);//遍历容器print(s1);set<int>s2;for(int i=0;i<10;i++){s2.insert(i);}print(s2);if(s2.empty()){cout<<"s2 is empty"<<endl;}else{cout<<"s2 is not empty"<<endl;}s2.swap(s1);print(s1);

set容器插入和删除

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(elem); //删除容器中值为elem的元素。
   set<int>s1;//插入数据,只有insert方式//set容器不允许插入重复值s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);s1.insert(50);print(s1);s1.erase(30);s1.erase(s1.begin());print(s1);s1.clear();print(s1);

set容器查找与统计

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器(位置);若不存在,返回set.end();
  • count(key); //统计key的元素个数
    set<int>s1;s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);s1.insert(50);set<int>::iterator pos=s1.find(200);if(pos != s1.end()){cout<<"find it"<<*pos<<endl;}else{cout<<"not find"<<endl;}int num=s1.count(300);cout<<"nums of 30 is :"<<num<<endl;

set 和multiset的区别

区别:

  • set不可以插入重复数据,而multiset可以
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据
    set<int>s1;pair<set<int>::iterator,bool>ret=s1.insert(10);if(ret.second){cout<<"firt insert success"<<endl;}else{cout<<"fisrt insert fault"<<endl;}ret=s1.insert(10);if(ret.second){cout<<"firt insert success"<<endl;}else{cout<<"fisrt insert fault"<<endl;}multiset<int>ms;ms.insert(100);ms.insert(100);for(multiset<int>::iterator it=ms.begin();it!=ms.end();it++){cout<<*it<<endl;}

pair对组创建

成对出现的数据,利用队组可以返回两个数据

使用的时候不需要包含头文件

两种创建方式:

pair<type,type>p(value1,value2);
pair<typr,type>p=make_pair(value1,value2);
int main()
{pair<string ,int>p("tom",20);cout<<"name: "<<p.first<<"age: "<<p.second<<endl;pair<string ,int >p2=make_pair("lct",40);cout<<"name: "<<p2.first<<"age: "<<p2.second<<endl;
}

set容器排序

set容器默认排序规则为从小到大

利用仿函数,可以改变排序规则

set存放内置统类型:

class mycompare
{
public:bool operator()(int v1,int v2){return v1>v2;}
};int main()
{set<int>s1;for(int i=0;i<10;i++){s1.insert(i);}print(s1);//指定排序规则为大到小set<int,mycompare>s2;for(int i=0;i<10;i++){s2.insert(i);}for(set<int,mycompare>::iterator it=s2.begin();it!=s2.end();it++){cout<<*it<<" ";}cout<<endl;}

注意:加上仿函数之后,对应的迭代器也会发生改变,因此需要重新写一个迭代器来遍历容器

自定义数据类型:

class person
{
person(string name,int age)
{this->m_name=name;this->m_age=age;
}
public:string m_name;int m_age;
};class compareperson
{
public:bool operator()(const person&p1,const person &p2){return p1.m_age>p2.m_age;}
};int main()
{//自定义数据类型,都要指定排序规则set<person,compareperson>s;person p1("刘备",35);person p2("曹操",45);person p3("孙权",40);person p4("赵云",25);person p5("张飞",35);person p6("关羽",35);s.insert(p1);s.insert(p2);s.insert(p3);s.insert(p4);s.insert(p5);s.insert(p6);for(set<person,compareperson>::iterator it=s.begin();it!=s.end();it++){cout<<"name: "<<(*it).m_name<<" age"<<(*it).m_age<<" ";}
}

set/multiset容器相关推荐

  1. set和multiset容器

    1 set和multiset容器的能力 set 和multiset容器的内部结构通常由平衡二叉树(balancedbinary tree)来实现.当元素放入容器中时,会按照一定的排序法则自动排序,默认 ...

  2. set和multiset容器简介

    set和multiset容器简介 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年06月20日 set 是一个集合容器,其中所包含的元素是唯一的,集合中的元素按 ...

  3. C++STL的set/ multiset容器

    C++STL的set/ multiset容器 set基本概念 set大小和交换 set插入和删除 set查找和统计 set和multiset区别 pair对组创建 set容器排序 set基本概念 简介 ...

  4. c++中的set容器和multiset容器

    set容器基本概念 set的特性是,所有元素都会根据元素的键值自动被排序.set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值.set不允许两个元素又相同的键值. 我们不可以 ...

  5. 第十三篇:multimap容器和multiset容器中的find操作

    前言 multimap容器是map容器的" 增强版 ",它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容 ...

  6. stl之multiset容器的应用

    与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,只是multiset容器允许将重复的元素健值插入,而set容器则不允许. set容器所使用的C++标准头文件set,其实也是 ...

  7. 【C++】【第六篇-2】【黑马 p215~p242】【list容器】【set/multiset容器】【map/multimap容器】【函数对象】【谓词】【内建函数对象】

    [C++][第六篇-2][黑马 p215~p242][list容器][set/multiset容器][map/multimap容器][函数对象][谓词][内建函数对象] 3.7 list容器(p215 ...

  8. c++STL标准模板库(关联式容器(set,multiset容器))

    关联式容器(associate容器)是STL提供的容器的一种,其中元素与序列容器不同的是它已经排过序,它主要通过关键字的方式来提高查询效率.关联式容器包含set.multiset.map.multim ...

  9. STL14-set/multiset容器

    set只有一个方法就是insert #include<iostream> #include<set> //set和multiset是一个头文件 //set内部实现机制 红黑色( ...

最新文章

  1. AFNetworking post请求遇到问题解决过程
  2. 10大机器学习算法速览,带你开启AI之旅
  3. 【转】Spring Bean单例与线程安全
  4. session图片验证码,页面和请求是两个地址。android手机好用,iphone 失效。
  5. Eclipse 下载 开源项目 maven依赖丢失和 Deployment Assembly 丢失
  6. 2021年度移动广告流量观察白皮书
  7. php 迭代设计模式 -- BookList -- 分页
  8. 本地也能运行AWS?是的,AWS开始进军混合云领域了
  9. DOS命令之ping命令大全详解
  10. 巴菲特:比特币纯粹是FOMO(害怕错过)
  11. 和python高级知识_Python中的5个高阶概念属性的知识点!你要了解明白哦!
  12. intellij idea+easychm生成帮助文档
  13. Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析
  14. linux php源码安装mysql_linux源码安装mysql5.7
  15. Algs4-1.2.8引用型变量赋值-数组复制
  16. brew update:以下未跟踪的工作树文件将被合并覆盖:
  17. Python 机器学习——解决过拟合的方法
  18. 从0开始实现自动化运维工具(一)
  19. 一篇文章带你登顶 MacBook高效工作环境配置
  20. BGI-College生信入门系列——3、数据库

热门文章

  1. sql用于字符串的聚合函数_SQL字符串函数用于数据整理(争用)
  2. mercurial和svn_DBA Mercurial简介–处理文件和更改
  3. Kotlin-Note
  4. python脚本打包成exe可执行文件
  5. 截图截取各种右键菜单的方法
  6. BZOJ4133 : Answer的排队
  7. lintcode-135-数字组合
  8. 【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set...
  9. jsoup: Java HTML Parser
  10. 又一个查询,哥整了一天,NND有点受不鸟了