使用必须包含头文件set

1)multiset

*:定义

如果不给第二个参数,默认less<key>,即用<来进行。

例如:

A是一个类的名字,则可以定义一个容器对象如下:

multiset<A>s;

由于multiset 的类型参数可以默认,所以上面的语句等价于:

multiset<int, less<A>,allocator<A>s>;

**:multiset的成员函数

find和count并不是通过==来进行比较值是否相等。它们的比较原则是x<y和y<x同时为假。

3)例

//program 19.4.2.1.cpp  multiset的用法
#include <iostream>
#include <set>  //使用multiset须包含此文件
using namespace std;
template <class T>
void Print(T first, T last)
{for(;first != last ; ++first)cout << * first << " ";cout << endl;
}
class A
{private:    int n;public:A(int n_ ) { n = n_; }friend bool operator< ( const A & a1, const A & a2 ) {    return a1.n < a2.n; }friend ostream &  operator<< ( ostream & o, const A & a2 ){    o << a2.n;    return o; }friend class MyLess;
};
class MyLess
{
public:bool operator()( const A & a1, const A & a2) //按个位数比大小{ return ( a1.n % 10 ) < (a2.n % 10);  }
};
typedef multiset<A> MSET1;             //MSET1用 "<"比较大小
typedef multiset<A,MyLess> MSET2;     //MSET2用 MyLess::operator()比较大小
int main()
{const int SIZE = 6;A a[SIZE] = { 4,22,19,8,33,40 };MSET1 m1;       m1.insert(a,a+SIZE);   m1.insert(22);cout << "1) " << m1.count(22) << endl; //输出1) 2cout << "2) "; Print(m1.begin(),m1.end()); //输出 2) 4 8 19 22 22 33 40MSET1::iterator pp =  m1.find(19);if( pp != m1.end() ) //条件为真说明找到cout << "found" << endl; //本行会被执行,输出 foundcout << "3) "; cout << * m1.lower_bound(22) << "," <<* m1.upper_bound(22)<< endl;  //输出 3) 22,33pp = m1.erase(m1.lower_bound(22),m1.upper_bound(22));//pp指向被删元素的下一个元素cout << "4) "; Print(m1.begin(),m1.end()); //输出 4) 4 8 19 33 40cout << "5) "; cout << * pp << endl;       //输出 5) 33MSET2 m2; // m2里的元素按n的个位数从小到大排m2.insert(a,a+SIZE);cout << "6) "; Print(m2.begin(),m2.end()); //输出 6) 40 22 33 4 8 19return 0;
}

2)set

*:定义

template<class Key, class Pred=less<Key>,class A=allocator<Key>

class set {....}

set和multiset相似,差别在于set中不能有重复元素。multiset的成员函数set也有,但由于没有重复元素,所以set中插入单个元素的insert成员函数和multiset不同,其原型如下,返回一个pair模板类的对象。

pair<iterator,bool>insert(const T & val);

假如set的insert成员函数的返回值是对象x,那么x.second为ture,则说明插入成功,此时x.first指向被插入元素的迭代器;x.second为false,说明已经有一个一样的值,插入失败,x.first指向原有那个元素的迭代器。

关联容器的另一个成员函数equal_range返回值也是pair模板类对象:

pair<iterator,iterator>equal_range(const T & val);

2)例

//program 19.4.3.1.cpp  set的用法:
#include <iostream>
#include <set>  //使用set须包含此文件
using namespace std;
int main()
{typedef set<int>::iterator IT;int a[5] = { 3,4,6,1,2 };set<int> st(a,a+5);    // st里是 1 2 3 4 6pair< IT,bool> result;result = st.insert(5); // st变成  1 2 3 4 5 6if( result.second )    //插入成功则输出被插入元素cout << * result.first  << " inserted" << endl; //输出: 5 insertedif( st.insert(5).second ) cout << * result.first  << endl;elsecout << * result.first << " already exists" << endl; //输出 5 already existspair<IT,IT> bounds = st.equal_range(4);cout << * bounds.first << "," << * bounds.second ; //输出:4,5return 0;
}

转载于:https://www.cnblogs.com/by-dxm/p/5473531.html

4.2 set和multiset相关推荐

  1. C++ 中multiset 的使用

    multiset 的说明 C++ 中 multiset 它的主要特点就是元素会自动排序切允许有重复的元素(set中不允许元素重复) multiset 同样也是STL中的模板使用的时候 需要先引入 #i ...

  2. 洛谷P1110 报表统计 multiset stl好题

    题目链接 一开始自己想的是multiset维护顺序结构,然后查找所有的值差最小时候找加入的当前点的前驱以及后继,然后查找相邻两个的就用线段树维护一个差最小值~,但是后来发现是全局的,直接再开一个mul ...

  3. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  4. STL set multiset

    STL容器大的方向分为两类,序列式容器和关联式容器. 这两者通过数据在容器内的排列来区分.关联容器和顺序容器的根本不同在于:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素则是按它们在容器 ...

  5. 【ACM】 multiset 的 一些应用

    一.The kth great number 题目链接:https://vjudge.net/problem/HDU-4006 用set写超时 (在VJ里,用C++显示Compilation Erro ...

  6. C++_STL——map、multimap、set、multiset

    C++_STL--map.multimap.set.multiset 内部都由红黑树实现 这里专栏里其他文章提到的函数(方法)就不会再说 参考:cplusplus 有序哈希表 有序不可重复哈希表(映射 ...

  7. Guava包学习--Multiset

    Multiset之前倒是没用过,后来看了下还挺有用,其实它就是支持重复元素的HashSet,相当于list+set的集合,综合了两种集合的优点. 它扩展了Collection: @GwtCompati ...

  8. C++知识点32——使用C++标准库(关联容器set和multiset的初始化,赋值,查找,添加,删除与迭代器失效)

    关联容器map和multimap已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877和https://blog.csdn.ne ...

  9. MultiSet和Set的区别

    MultiSet和Set的区别: 1) MultiSet 可以插入完全相同的两条记录 会提高数据插入的速度 2) Set 不可以插入完全相同的两条记录 保证记录的唯一性 由于需要查重处理,会降低数据插 ...

  10. STL:set/multiset用法详解

    集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...

最新文章

  1. JAVA Static方法与单例模式的理解
  2. 深入学习Redis(4):哨兵
  3. PyTorch系列 | 如何加快你的模型训练速度呢?
  4. android手机设置时间设置,如何设置电信定制手机日期与时间
  5. 《那些年啊,那些事——一个程序员的奋斗史》——86
  6. Activate Windows server 2003 in VMware
  7. My97DatePicker 组件使用方法---My97DatePicker
  8. ABP框架系列之四十九:(Startup-Configuration-启动配置)
  9. 数据保护:从“随意架构”到简单可控
  10. cad批量打印快捷键_批量打印CAD图(无删减版)
  11. 窗口电压比较器电路设计
  12. Android 腾讯Bugly热更新笔记
  13. 树莓派配套系统_3.95寸配套树莓派显示屏,移植好操作系统,普及树莓派显示屏...
  14. DS栈—波兰式,逆波兰式
  15. 计算机windows怎么开启,Win10怎么打开我的电脑_Win10正式版怎么打开我的电脑?-192路由网...
  16. TortoiseSVN配置外部对比工具
  17. 创业之前你需要了解的九个真相
  18. logback 日志脱敏 隐藏PII信息
  19. 网络基础系统红枫产线落地金华,助力打造千亿级产业集群!
  20. VLAN应用篇系列:(7)华为 H3C交换机VLAN聚合功能(实现不同VLAN,同一网段,二层隔离,三层互通)

热门文章

  1. Java游戏程序设计教程 4.5打砖块游戏
  2. linux批量配置文件,linux下根据用户输入批量修改配置文件ip
  3. pandas获取某行数据
  4. 基础知识(四)C++常用函数.txt
  5. Caffe傻瓜系列(3):激活层(Activiation Layers)及参数
  6. windows10下搭建spark平台
  7. 2021-08-21 初识javabean
  8. input 上传图片_selnium远程机上传图片遇到的坑-布布扣
  9. 差分进化算法和遗传算法 区别 谁更好
  10. LaTeX 切换其它另外的期刊会议模板