数据结构:集合

首先直接贴出来例程:

 1 #include<iostream>
 2 #include<set>
 3 using namespace std;
 4 struct Info  //如果集合中的元素是自定义类型,一定要重载<运算符 
 5 {
 6     string name;
 7     double score;
 8     bool operator<(const Info &a) const
 9     {
10         return a.score<score;
11     }
12 };
13 set<int> s;
14 int main()
15 {
16     s.insert(1);
17     s.insert(2);
18     s.insert(3);
19     s.insert(1);  //重复元素是不计算在内的 
20     cout<<s.size()<<endl;  //当前集合中元素个数
21     cout<<s.max_size()<<endl;  //当前集合最多放多少元素
22     cout<<*s.begin()<<endl;  //当前集合的第一个元素
23     cout<<*s.end()<<endl;  //当前集合的最后一个原生物 
24     cout<<s.count(2)<<endl;  //判断某一个元素是否在集合出现过 
25     set<int>::iterator tmp=s.find(3);   //返回当前元素的迭代器位置,如果没找到返回s.end() 
26     cout<<*tmp<<endl; 
27     for(set<int>::iterator it = s.begin();it!=s.end();++it)    
28     {
29         cout<<*it<<endl;
30     }
31     return 0;
32 }

然后我们注意几个地方就好了

第一个地方是对于结构体的处理,要记住<运算符重载函数,因为set中的元素是默认有序的

第二个需要注意的地方是find返回的是迭代器,一定不能直接cout或者直接用

然后补充几个特殊的成员函数:

     pair<set<int>::const_iterator,set<int>::const_iterator> pr;
     pr = s.equal_range(3);
     cout<<"第一个大于等于 3 的数是:"<<*pr.first<<endl;
     cout<<"第一个大于 3的数是:"<<*pr.second<<endl;

返回的是pair,而且pair里放的也是迭代器

 //删除迭代器位置的元素
     s.erase(s.begin());
 //删除迭代器区间的元素
     first = s.begin();
     second = s.begin();
     second++;
     second++;
     s.erase(first,second);
 //给定值,删除元素(好像只有这个有用)
     s.erase(8);

其实上一个函数equal_range函数完全是为了规避遍历的

这里还有一个类似的函数

     cout<<*s.lower_bound(3)<<endl;
     cout<<*s.upper_bound(3)<<endl;
//返回第一个大于等于key的迭代器指针
//返回第一个大于key的迭代器指针

其实就是把pair拆开了。

集合的用法就介绍到这里,目前我们在枚举集合元素,进行的交并补等运算时,都是采用二进制形式来处理的,具体可参考本博客的另一篇博文

posted @ 2018-07-17 17:02  静听风吟。  阅读(361)  评论(0编辑  收藏  举报