1. 所在头文件: <set>, 命名空间: std ; 声明如下:

 1 namespace std{
 2     template <class T,
 3               class Compare = less<T>,
 4               class Allocator = allocator<T> >
 5     class set;
 6     template <class T,
 7               class Compare = less<T>,
 8               class Allocator = allocator<T> >
 9     class multiset;
10 }

  - 只要是assignable+copyable+comparable的类型T都可以作为它们的参数.

  - 内部是用红黑树实现的.

  - set不允许重复元素, 而multiset允许,  它们都不提供用来直接存取元素的任何操作函数.

  - 通过迭代器进行元素间接存取, 有一个限制: 从迭代器角度看, 元素值是常数.

2. 基本操作

  - set 和 multiset的构造/析构形式(6种):

1 set c;
2 set c(op); // op指定排序规则
3 set c1(c2);
4 set c(begin,end);
5 set c(begin,end,op)
6 c.~set()

  - size()/empty()/max_size()/c1!=c2//c1==c2//c1<c2//c1>c2//c1<=c2//c1>=c2

  - 要求有相同的排序准则. 不然会编译错误, 因为不是相同的类型.

  - set和multiset的查询操作函数(是算法函数的特殊版本, 针对集合进行优化, 可以有对数而非线性效率)

    -  count(elem); //返回值为elem的元素个数

    -  find(elem); //返回元素值为elem的第一个元素位置, 否则返回end()

    -  lower_bound(elem); //返回elem的第一个可插入的位置, 也就是 元素值 >= elem元素值的第一个元素位置.

    -  upper_bound(elem); //和lower_bound()相对

    -  equal_range(elem);//返回的是pair值对

  - 元素的插入和删除

    -  c.erase(elem/pos/[begin,end]);

    -  c.insert(elem/[pos,elem]/[begin,end]);

    -  c.clear();

  - 如果multiset内含有重复元素, 就不能使用 erase()来删除第一个. 一般是用成员函数find()找到一个, 然后erase()

3. 实例:

set:

 1 #include <iostream>
 2 #include <iterator>
 3 #include <set>
 4 using namespace std;
 5 int main(){
 6     typedef set<int,greater<int> > IntSet;
 7     IntSet coll1;
 8     coll1.insert(4);
 9     coll1.insert(3);
10     coll1.insert(5);
11     coll1.insert(1);
12     coll1.insert(6);
13     coll1.insert(2);
14     coll1.insert(5);
15
16     copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
17     cout<<endl;
18
19     pair<IntSet::iterator,bool> status = coll1.insert(4);
20     if(status.second){
21         cout<<"4 is inserted"<<endl<<distance(coll1.begin(),status.first)+1<<endl;
22     }else{
23         cout<<"4 is already existed!"<<endl;
24         coll1.insert(7);
25     }
26
27     copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
28     cout<<endl;
29
30     set<int> coll2(coll1.begin(),coll1.end());
31     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
32     cout<<endl;
33
34     coll2.erase(coll2.begin(),coll2.find(3));
35
36     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
37     cout<<endl;
38
39     cout<<coll2.erase(5)<<" elem of 5 is removed!"<<endl;
40
41     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
42     cout<<endl;
43
44
45     return 0;
46 }

View Code

multiset:

 1 #include <iostream>
 2 #include <iterator>
 3 #include <set>
 4 using namespace std;
 5 int main(){
 6     typedef multiset<int,greater<int> > IntSet;
 7     IntSet coll1;
 8     coll1.insert(4);
 9     coll1.insert(3);
10     coll1.insert(5);
11     coll1.insert(1);
12     coll1.insert(6);
13     coll1.insert(2);
14     coll1.insert(5);
15
16     copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
17     cout<<endl;
18
19     // 这里运行重复值, 所以没有返回失败状态.
20     IntSet::iterator pos = coll1.insert(4);
21     if(pos!=coll1.end()){
22         cout<<"4 is inserted"<<endl<<distance(coll1.begin(),pos)+1<<endl;
23     }else{
24         cout<<"4 is can't be insert!"<<endl;
25         coll1.insert(7);
26     }
27
28     copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
29     cout<<endl;
30
31     multiset<int> coll2(coll1.begin(),coll1.end());
32     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
33     cout<<endl;
34
35     coll2.erase(coll2.begin(),coll2.find(3));
36
37     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
38     cout<<endl;
39
40     cout<<coll2.erase(5)<<" elem of 5 is removed!"<<endl;
41
42     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
43     cout<<endl;
44
45     return 0;
46 }

View Code

在执行期指定排序准则(默认是less<T>())

 1 #include <iostream>
 2 #include <iterator>
 3 #include <set>
 4 using namespace std;
 5 template <class T>
 6 class RuntimeCmp{
 7 public:
 8     enum cmp_mode {normal, reverse};
 9 private:
10     cmp_mode mode; //在同一个类中定义了枚举, 然后定义变量.
11 public:
12     RuntimeCmp(cmp_mode m=normal): mode(m){}
13     bool operator()(const T& t1, const T& t2) const{
14         return mode == normal? t1<t2: t1>t2;
15     }
16     // 返回值给谁用?
17     bool operator == (const RuntimeCmp& rc){
18         return mode == rc.mode;
19     }
20 };
21 typedef set<int,RuntimeCmp<int> > IntSet;
22 void fill(IntSet & set){
23     set.insert(4);
24     set.insert(7);
25     set.insert(5);
26     set.insert(1);
27     set.insert(6);
28     set.insert(2);
29     set.insert(5);
30 }
31 int main(){
32     IntSet coll1;
33     fill(coll1);
34     copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
35     cout<<endl;
36     RuntimeCmp<int> reverse_order(RuntimeCmp<int>::reverse);
37     IntSet coll2(reverse_order);
38     fill(coll2);
39     copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
40     cout<<endl;
41     coll1 = coll2;
42     coll1.insert(3);
43     copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "));
44     cout<<endl;
45     //比较排序准则是否一致, 由于coll1 从coll2 拷贝而来, 所以一致.
46     cout<<(coll1.value_comp() == coll2.value_comp())<<endl;
47
48     return 0;
49 }

View Code

转载于:https://www.cnblogs.com/roger9567/p/4889542.html

STL中 set 和 multiset相关推荐

  1. Multiset(中)——STL中的multiset

    Multiset的中文名是多重集合,其实就是集合的扩展版.唯一的不同是集合中一个值只能出现一次,而多重集合中一个值可以出现多次. 粗略看了看MSDN,在STL中,multiset和set的成员函数声明 ...

  2. 关于STL中的map和hash_map

    在网上看到有关STL中hash_map的文章,以及一些其他关于STL map和hash_map的资料,总结笔记如下:     1.STL的map底层是用红黑树实现的,查找时间复杂度是log(n):   ...

  3. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  4. 理解stl中的erase

    vector<Path *> vec; vec.push_back(new Path); vec.erase(vec.begin()); vector<Path > vec; ...

  5. C++ STL中哈希表 hash_map介绍

    0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...

  6. c++STL中的find()函数 有两种使用方法

    c++STL中的find()函数 有两种使用方法 方法一: 开头引头文件:中的函数 其调用形式为 find(start,end,value) start搜寻的起点,end搜寻的终点,要寻找的value ...

  7. php的set 容器,关于STL中set容器的一些总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  8. 红黑树实现——STL中的map

    From: http://blog.csdn.net/zhongjiekangping/article/details/6934571 红黑树实现--STL中的map [ 2009-07-24 13: ...

  9. 【贪玩巴斯】C++提高编程,掌握STL中最关键的容器技术~(三){map、set、list、queue、stack 五大容器一篇解决!} //2021-08-25

    //  day_03 //  Created by AchesonD16 贪玩巴斯 on 2021/8/19. 1. stack容器 (栈) 1.1 stack 基本概念 栈 概念: stack是一种 ...

最新文章

  1. 如何获取boss直聘搜索牛人被屏蔽的姓名
  2. Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
  3. 去掉a标签下划线_条码软件如何修改条码标签的字体格式
  4. ffmpeg进行混音,将两路音频pcm数据合成一路输出
  5. 非法关机 mysql_转 mysql数据库非法关机铁血教训
  6. L1-035 情人节(两种方法)
  7. 哦?你会视频剪辑?是的。好,录用你!
  8. 大神级ppt作品欣赏_超写实绘画,逼真到让你怀疑自己的双眼,各路超写实大神作品欣赏...
  9. 国家央行数字货币的优势与挑战
  10. 阿里云服务器DDoS基础防护设置及常见问题
  11. python --opencv图像处理轮廓(寻找轮廓、绘制轮廓)详解
  12. KALI虚拟机挂代理教程
  13. 《工程伦理》网课第十二章课后习题答案
  14. 使用Python批量替换csdn文章的图片链接(解决csdn无法加载第三方图床的问题)
  15. 微信开发 缓存Storage
  16. 电子实训与毕业设计开放式训练装置
  17. DOTA英雄 精美图片 大集合
  18. linux ps -ef和ps -fu,linux ps命令详解
  19. 轻松玩转新编日语1 zz江沪
  20. WiFi(Wireless Fidelity)基础(四)

热门文章

  1. 往map里的vector添加_面试官:同步容器(如Vector)的所有操作一定是线程安全的吗?...
  2. python字符串处理函数汇总_Python内置的字符串处理函数详细整理(覆盖日常所用)...
  3. python安装opencv2.4.9_Python学习之一:Python2.7与opencv2.4安装配置
  4. html5仿腾讯,高仿腾讯QQ Xplan(X计划)的H5页面(1):threejs创建地球
  5. 电信设置的nat 虚拟服务器192.168.1.3 是什么,VMware WorkStation的三种网络连接方式详解...
  6. VMware vSphere 6 Enterprise Plus 永久激活许可证-亲测可用
  7. Java事件侦听器函数_SWT 计算器 按钮事件监听 获取按钮text值
  8. docker挂载本地目录_Docker:使用本地卷和tmpfs挂载
  9. Memcache 安装
  10. (转) 各种好用的插件 Xcode