set和multiset
来源:互联网 发布:js保存数据到本地文件 编辑:程序博客网 时间:2024/06/05 16:26
集合(Set)是一种包含已排序对象的关联容器。 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,它不会插入相同键值的元素,而采取忽略处理。
平衡二叉树的检索使用中序遍历算法,检索效率高于vector、deque和list等容器。
对于set容器中的键值,不可直接去修改!应该先删除该键值,再插入新的键值。
头文件为#include <set>
1.创建set集合对象
set <Element> s;Element容器中的数据类型(可以是int,double等系统自带的类型,也可以为自定义类型)
2.元素的插入和遍历
insert()插入元素
迭代器遍历
#include <iostream>#include <set>using namespace std;int main(){set <int> s; //建立set容器 s.insert(6);//插入6 s.insert(1);//插入1 s.insert(9);//插入9 s.insert(1);//插入1 for(set<int>::iterator it = s.begin(); it != s.end(); it++)//定义前向迭代器遍历输出 { printf("%d ",*it);}printf("\n");for(set<int>::reverse_iterator rit = s.rbegin(); rit != s.rend(); rit++)//定义反向迭代器遍历输出 { printf("%d ",*rit);} return 0;}2.元素的删除
erase()删除函数,删除某一个元素或者某一段。
#include <iostream>#include <set>using namespace std;int main(){set <int> s; //建立set容器 s.insert(6);//插入6 s.insert(1);//插入1 s.insert(9);//插入9 for(set<int>::iterator it = s.begin(); it != s.end(); it++)//定义前向迭代器遍历输出 { printf("%d ",*it);} s.erase(9);//删除9 printf("\n"); for(set<int>::iterator it = s.begin(); it != s.end(); it++)//定义前向迭代器遍历输出 { printf("%d ",*it);}printf("\n"); return 0;}3.元素的检索
find()函数查找键值,查找到就返回迭代器位置,如果查找不到返回end位置的迭代器
count()函数判断某个元素是否存在
#include <iostream>#include <set>using namespace std;int main(){set <int> s; //建立set容器 s.insert(6);//插入6 s.insert(1);//插入1 s.insert(9);//插入9 set<int>::iterator it; it=s.find(6);//查找键值6,如果查找不到返回end位置的迭代器 if(it != s.end())//找到了 printf("%d\n",*it);else printf("not find it\n");//查找元素999是否存在存在返回true不存在返回fasle if(s.count(999))//找到了 printf("%d\n",*it);else printf("not find it\n"); return 0;}
4.自定义比较函数(有空了专门补一个有关这个博客把。。。)
#include <iostream>#include <set>#include <functional>using namespace std;struct Node{int a,b; bool operator < (const Node &A) const{ return a > A.a; }};set <Node> s; //自定义排序函数构造setint main(){Node x;x.a = 1,x.b = 39; s.insert(x); x.a = 2,x.b = 17; s.insert(x); x.a = 3,x.b = 28; s.insert(x); for(set<Node>::iterator it = s.begin(); it != s.end(); it++) { printf("%d %d\n",(*it).a,(*it).b);} return 0;}
多重集合容器(multiset)
基本和set一样,但是这个允许插入重复的键值!因为包含重复元素,所以,在插入元素、删除元素、查找元素上较set有差别
1.插入元素
#include <iostream>#include <set>using namespace std;int main(){multiset <int> ms; //建立multiset容器 ms.insert(6);//插入6 ms.insert(1);//插入1 ms.insert(9);//插入9 ms.insert(1);//插入1 for(multiset<int>::iterator it = ms.begin(); it != ms.end(); it++)//定义前向迭代器遍历输出 { printf("%d ",*it);}printf("\n"); return 0;}2.删除元素
#include <iostream>#include <set>using namespace std;int main(){multiset <string> ms; //建立multiset容器 ms.insert("666");//插入666 ms.insert("111");//插入111 ms.insert("abc");//插入abc ms.insert("aaa");//插入aaa ms.insert("111");//插入111 for(multiset<string>::iterator it = ms.begin(); it != ms.end(); it++)//定义前向迭代器遍历输出 { cout<< *it <<endl;}printf("\n"); int n = ms.erase("111");//删除"111"所有元素,返回删除个数2 printf("删除元素个数为:%d\n",n); for(multiset<string>::iterator it = ms.begin(); it != ms.end(); it++)//定义前向迭代器遍历输出 { cout<< *it <<endl;}printf("\n"); return 0;}3.查找元素
返回符合要求的第一个元素的迭代器位置。他有lower_bound和upper_bound的两个函数。
#include <iostream>#include <set>using namespace std;int main(){multiset <string> ms; //建立multiset容器 ms.insert("666");//插入666 ms.insert("111");//插入111 ms.insert("abc");//插入abc ms.insert("aaa");//插入aaa ms.insert("111");//插入111 multiset<string>::iterator it;it=ms.find("111");//查找键值6,如果查找不到返回end位置的迭代器 if(it != ms.end())//找到了 cout << *it << endl;else printf("not find it\n");it=ms.find("xyz"); if(it != ms.end())//找到了 cout << *it << endl;else printf("not find it\n");it=ms.lower_bound("111");if(it != ms.end())//找到了 cout << *it << endl;else printf("not find it\n"); return 0;}
阅读全文
0 0
- std::set和multiset
- set和multiset
- set和multiset容器
- Set和multiset
- STL---set和multiset
- STL set和multiset
- set和multiset 学习
- 容器set和multiset
- STL set和multiset
- 容器set和multiset
- STL - set和multiset
- set和multiset容器
- set 和 multiset
- Set和multiset容器
- set和multiset
- multiset和set的区别
- STL之set和multiset
- 再谈set和multiset容器
- 分类方法中样本类别不均衡问题
- 双列集合
- Bailian4071 查找出现了k次的字符【字符串】
- Android安卓——实现发短信功能的代码
- ndk 编译问题
- set和multiset
- BM算法
- jzoj5484 【清华集训2017模拟11.26】快乐树 (发现性质的dp)
- 详解java的回掉函数与接口
- java 枚举类型
- php trait
- Scrapy框架学习(一)----Scrapy介绍及第一个项目
- IMX6 理解Android编译命令
- (初中OJ)2242. 【2017.11.25普及组模拟】Bob