Set集合容器
1、set集合容器创建set集合对象
//创建set对象时 要指定元素类型 元素排列按默认比较规则 比较规则可以自己定义 #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; int main() { set<int>s; return 0; }
2、set集合容器元素的插入与中序遍历
//使用insert()方法 插入的具体规则在默认比较规则下 是按元素值由大到小插入的 比较规则可自己定义 //set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。 #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; int main() { set<int> s; int n; int m; while(scanf("%d",&n)!=EOF) { for(int i=0; i<n; i++) { scanf("%d",&m); s.insert(m); } set<int>::iterator p; for(p=s.begin(); p!=s.end(); p++) { cout<<*p<<" "; } } return 0; }
3、set集合容器元素的反向遍历
//使用反向迭代器reverse_iterator可以反向遍历集合,输出反向排序结果 需要用到rbegin()和rend() 分别给出反向遍历的开始位置和结束位置 #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; int main() { set<int> s; s.insert(12); s.insert(6); s.insert(8); s.insert(1); s.insert(8); set<int>::reverse_iterator p; for(p=s.rbegin(); p!=s.rend(); p++) { cout<<*p<<" "; } return 0; }
4、set集合容器元素的删除
//集合具高效删除功能 并自动重新调整内部的红黑树的平衡 删除的对象可以是迭代器位置上的元素 或者是某键值的元素 一个区间 清空集合 #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; int main() { set<int> s; s.insert(12); s.insert(6); s.insert(8); s.insert(1); s.insert(8); set<int>::reverse_iterator rit; for(rit=s.rbegin(); rit!=s.rend(); rit++) { cout<<*rit<<" "; } cout<<endl; s.erase(6); for(rit=s.rbegin(); rit!=s.rend(); rit++) { cout<<*rit<<" "; } cout<<endl; s.erase(s.begin()); for(rit=s.rbegin(); rit!=s.rend(); rit++) { cout<<*rit<<" "; } cout<<endl; s.clear(); cout<<s.size()<<endl; return 0; }
5、set集合容器元素的检索
//使用find()对集合进行搜索 如找到查找的键值 返回其迭代器位置 否则 返回集合的end() #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; int main() { set<int> s; s.insert(12); s.insert(6); s.insert(8); s.insert(1); s.insert(8); set<int>::iterator it; it=s.find(6); if(it!=s.end()) cout<<*it<<endl; else cout<<"not find it!"<<endl; it=s.find(20); if(it!=s.end()) cout<<*it<<endl; else cout<<"not find it!"<<endl; return 0; }
6、set集合容器自定义比较函数
//如果元素不是结构体 #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; struct N { bool operator()(int m,int n) { return m>n; } }; int main() { int n; int m; set<int,N>s; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&m); s.insert(m); } set<int,N>::iterator p; for(p=s.begin();p!=s.end();p++) cout<<*p<<" "; cout<<endl; } return 0; }
//如果元素是结构体 #include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> using namespace std; struct N { string name; double grade; bool operator<(const N&a)const { return grade>a.grade; } }; int main() { int n; set<N>s; int m; N a; while(scanf("%d",&n)!=EOF) { for(int i=0; i<n; i++) { cin>>a.name>>a.grade; s.insert(a); } set<N>::iterator p; for(p=s.begin(); p!=s.end(); p++) cout<<(*p).name<<" "<<(*p).grade<<endl; } return 0; }