STL中 set 和 multiset
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相关推荐
- Multiset(中)——STL中的multiset
Multiset的中文名是多重集合,其实就是集合的扩展版.唯一的不同是集合中一个值只能出现一次,而多重集合中一个值可以出现多次. 粗略看了看MSDN,在STL中,multiset和set的成员函数声明 ...
- 关于STL中的map和hash_map
在网上看到有关STL中hash_map的文章,以及一些其他关于STL map和hash_map的资料,总结笔记如下: 1.STL的map底层是用红黑树实现的,查找时间复杂度是log(n): ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- 理解stl中的erase
vector<Path *> vec; vec.push_back(new Path); vec.erase(vec.begin()); vector<Path > vec; ...
- C++ STL中哈希表 hash_map介绍
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...
- c++STL中的find()函数 有两种使用方法
c++STL中的find()函数 有两种使用方法 方法一: 开头引头文件:中的函数 其调用形式为 find(start,end,value) start搜寻的起点,end搜寻的终点,要寻找的value ...
- php的set 容器,关于STL中set容器的一些总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- 红黑树实现——STL中的map
From: http://blog.csdn.net/zhongjiekangping/article/details/6934571 红黑树实现--STL中的map [ 2009-07-24 13: ...
- 【贪玩巴斯】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是一种 ...
最新文章
- 如何获取boss直聘搜索牛人被屏蔽的姓名
- Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
- 去掉a标签下划线_条码软件如何修改条码标签的字体格式
- ffmpeg进行混音,将两路音频pcm数据合成一路输出
- 非法关机 mysql_转 mysql数据库非法关机铁血教训
- L1-035 情人节(两种方法)
- 哦?你会视频剪辑?是的。好,录用你!
- 大神级ppt作品欣赏_超写实绘画,逼真到让你怀疑自己的双眼,各路超写实大神作品欣赏...
- 国家央行数字货币的优势与挑战
- 阿里云服务器DDoS基础防护设置及常见问题
- python --opencv图像处理轮廓(寻找轮廓、绘制轮廓)详解
- KALI虚拟机挂代理教程
- 《工程伦理》网课第十二章课后习题答案
- 使用Python批量替换csdn文章的图片链接(解决csdn无法加载第三方图床的问题)
- 微信开发 缓存Storage
- 电子实训与毕业设计开放式训练装置
- DOTA英雄 精美图片 大集合
- linux ps -ef和ps -fu,linux ps命令详解
- 轻松玩转新编日语1 zz江沪
- WiFi(Wireless Fidelity)基础(四)
热门文章
- 往map里的vector添加_面试官:同步容器(如Vector)的所有操作一定是线程安全的吗?...
- python字符串处理函数汇总_Python内置的字符串处理函数详细整理(覆盖日常所用)...
- python安装opencv2.4.9_Python学习之一:Python2.7与opencv2.4安装配置
- html5仿腾讯,高仿腾讯QQ Xplan(X计划)的H5页面(1):threejs创建地球
- 电信设置的nat 虚拟服务器192.168.1.3 是什么,VMware WorkStation的三种网络连接方式详解...
- VMware vSphere 6 Enterprise Plus 永久激活许可证-亲测可用
- Java事件侦听器函数_SWT 计算器 按钮事件监听 获取按钮text值
- docker挂载本地目录_Docker:使用本地卷和tmpfs挂载
- Memcache 安装
- (转) 各种好用的插件 Xcode