首先直接贴出来例程:
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拆开了。
集合的用法就介绍到这里,目前我们在枚举集合元素,进行的交并补等运算时,都是采用二进制形式来处理的,具体可参考本博客的另一篇博文