STL中set的用法
set,顾名思义,就是数学上的集合——每个元素最多只出现一次,并且set中的元素已经从小到大排好序。
头文件:#include<set>
常用的函数:
begin() 返回set容器的第一个元素的地址
end() 返回set容器的最后一个元素地址
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数
erase(it) 删除迭代器指针it处元素
样例如下:
1 #include <iostream> 2 #include <set> 3 4 using namespace std; 5 6 int main() 7 { 8 set<int> s; 9 s.insert(1); 10 s.insert(2); 11 s.insert(3); 12 s.insert(1); 13 cout<<"set 的 size 值为 :"<<s.size()<<endl; 14 cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; 15 cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl; 16 cout<<"set 中的最后一个元素是:"<<*s.end()<<endl; 17 s.clear(); 18 if(s.empty()) 19 { 20 cout<<"set 为空 !!!"<<endl; 21 } 22 cout<<"set 的 size 值为 :"<<s.size()<<endl; 23 cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; 24 return 0; 25 }
还有两个功能类似的函数:count()和find()
1.count() :用来查找set中某个元素出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
2.find(): 用来查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end() 。 (最后一个元素的下一个位置,s为set的变量名)
样例如下:
1 #include <iostream> 2 #include <set> 3 4 using namespace std; 5 6 int main() 7 { 8 set<int> s; 9 set<int>::iterator it; //创建一个他对应的迭代器 10 11 s.insert(1); 12 s.insert(2); 13 s.insert(3); 14 s.insert(1); 15 cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl; 16 cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl; 17 18 it1 = st1.find(4); //查找数据 19 if (it1 != st1.end()) //如果找到就输出数据 20 { 21 cout << *it1 << endl; 22 } 23 24 return 0; 25 }
set的遍历,需要用到迭代器,具体的方法见下面的代码:
1 ##include <iostream> 2 #include<set> 3 using namespace std; 4 5 6 int main() 7 { 8 set<int> s; //创建一个int类型的set 9 10 s.insert(10); //插入数据 11 s.insert(30); 12 s.insert(20); 13 s.insert(40); 14 15 //遍历数据,用迭代器遍历数据 16 for (set<int>::iterator it = s.begin(); it != s.end(); ++it) 17 { 18 cout << *it << endl; 19 } 20 //这里用到了set中的元素已经从小到大排好序的性质 21 22 return 0; 23 }
最后,不得不提的就是结构体类型(struct )的set ,使用时必须要重载 '<' 运算符
1 #include<iostream> 2 #include<set> 3 #include<string> 4 using namespace std; 5 struct Info 6 { 7 string name; 8 double score; 9 bool operator < (const Info &a) const // 重载“<”操作符,自定义排序规则 10 { 11 //按score由大到小排序。如果要由小到大排序,使用“>”即可。 12 return a.score < score; 13 } 14 }; 15 int main() 16 { 17 set<Info> s; 18 Info info; 19 20 //插入三个元素 21 info.name = "Jack"; 22 info.score = 80; 23 s.insert(info); 24 info.name = "Tom"; 25 info.score = 99; 26 s.insert(info); 27 info.name = "Steaven"; 28 info.score = 60; 29 s.insert(info); 30 31 set<Info>::iterator it; 32 for(it = s.begin(); it != s.end(); it++) 33 cout << (*it).name << " : " << (*it).score << endl; 34 return 0; 35 } 36 /* 37 运行结果: 38 Tom : 99 39 Jack : 80 40 Steaven : 60 41 */