@Archger
2016-10-08T13:31:02.000000Z
字数 4141
阅读 882
STL set
#include<set>#include<iterator>#include<iostream>using namespace std;int main(){set<int>eg1;//插入eg1.insert(1);eg1.insert(100);eg1.insert(5);eg1.insert(1);//元素1因为已经存在所以set中不会再次插入1eg1.insert(10);eg1.insert(9);//遍历set,可以发现元素是有序的set<int>::iterator set_iter=eg1.begin();cout<<"Set named eg1:"<<endl;for(;set_iter!=eg1.end();set_iter++) cout<<*set_iter<<" ";cout<<endl;//使用size()函数可以获得当前元素个数cout<<"Now there are "<<eg1.size()<<" elements in the set eg1"<<endl;if(eg1.find(200)==eg1.end())//find()函数可以查找元素是否存在cout<<"200 isn't in the set eg1"<<endl;set<int>eg2;for(int i=6;i<15;i++)eg2.insert(i);cout<<"Set named eg2:"<<endl;for(set_iter=eg2.begin();set_iter!=eg2.end();set_iter++)cout<<*set_iter<<" ";cout<<endl;//获得两个set的并set<int>eg3;cout<<"Union:";set_union(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));//注意第五个参数的形式copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));cout<<endl;//获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下eg3.clear();set_intersection(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));cout<<"Intersection:";copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));cout<<endl;//获得两个set的差eg3.clear();set_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));cout<<"Difference:";copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));cout<<endl;//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩Beg3.clear();set_symmetric_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));cout<<endl;return 0;}
| 参数 | 描述 | 默认值 |
|---|---|---|
| Key | 集合的关键字和值的类型 | |
| Compare | 关键字比较函数,它的参数类型key参数指定的类型,如果第一个参数小于第二个参数则返回true,否则返回false | less<Key> |
| Alloc | set的分配器,用于内部内存管理 | alloc |
#include<iostream>#include<iterator>#include<set>using namespace std;struct ltstr{bool operator() (const char* s1, const char* s2) const{return strcmp(s1, s2) < 0;}};int main(){const int N = 6;const char* a[N] = {"isomer", "ephemeral", "prosaic","nugatory", "artichoke", "serif"};const char* b[N] = {"flat", "this", "artichoke","frigate", "prosaic", "isomer"};set<const char*,ltstr> A(a, a + N);set<const char*,ltstr> B(b, b + N);set<const char*,ltstr> C;cout << "Set A: ";//copy(A.begin(), A.end(), ostream_iterator<const char*>(cout, " "));set<const char*,ltstr>::iterator itr;for(itr=A.begin();itr!=A.end();itr++) cout<<*itr<<" ";cout << endl;cout << "Set B: ";copy(B.begin(), B.end(), ostream_iterator<const char*>(cout, " "));cout << endl;cout << "Union: ";set_union(A.begin(), A.end(), B.begin(), B.end(),ostream_iterator<const char*>(cout, " "),ltstr());cout << endl;cout << "Intersection: ";set_intersection(A.begin(), A.end(), B.begin(),B.end(),ostream_iterator<const char*>(cout," "),ltstr());cout<<endl;set_difference(A.begin(), A.end(), B.begin(), B.end(),inserter(C, C.begin()),ltstr());cout << "Set C (difference of A and B): ";copy(C.begin(), C.end(), ostream_iterator<const char*>(cout, " "));cout <<endl;return 0;}
其中的ltstr也可以这样定义
class ltstr{public:bool operator() (const char* s1,const char*s2)const{return strcmp(s1,s2)<0;}};
#include<set>#include<iostream>using namespace std;struct{int id;int score;string name;};struct compare{bool operator()(const Entity& e1,const Entity& e2)const {if(e1.score<e2.score) return true;elseif(e1.score==e2.score)if(e1.id<e2.id) return true;return false;}};int main(){set<Entity,compare>s_test;Entity a,b,c;a.id=123;a.score=90;a.name="bill";b.id=121;b.score=85;b.name="mary";c.id=130;c.score=85;c.name="jerry";s_test.insert(a);s_test.insert(b);s_test.insert(c);set<Entity,compare>::iterator itr;cout<<"Score List(ordered by score):\n";for(itr=s_test.begin();itr!=s_test.end();itr++)cout<<itr->id<<"---"<<itr->name<<"---"<<itr->score<<endl;return 0;}