文章目录:
来学STL(2)set 使用
大vvvvvv
按需求抓重点。收藏起来
最后一次更新与3月2日
说明
本文注重讲解常用的方法,偏方容易把我搞的云里雾里。
原创文章,未经允许禁止转载
set容器的定义
所有元素都会根据元素的键值自动排序,set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。(set的元素不像map那样可以同时拥有实值(value)和键值(key))。(来自博客园)
换而言之,就是一种集合,这个容器里面不会出现重复的元素,而且自动给你排序。排序从小到大。
set容器的简单使用(原始代码)
如果不追求更多使用方法,只是简单了解,请阅读下面的代码和总结。
注:其中迭代器的用法可跳转《STL加餐–迭代器的使用(初阶)–持续更新》
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
//加入元素5 4 3 2 1
for(int i = 5;i>=1;i--){
s.insert(i);
}
// 遍历set
set<int> :: iterator it ; //申请一个set的迭代器
for(it = s.begin();it != s.end();++it){
cout<<*it<<endl;
}
cout<<"s.size() = "<<s.size()<<endl; //输出set的大小
//再次加入元素1 2 3 4 5
for(int i = 1;i<=5;i++){
s.insert(i);
}
cout<<"s.size() = "<<s.size()<<endl; //再次输入大小
return 0;
}
运行结果
1
2
3
4
5
s.size() = 5
s.size() = 5
小解读 由上面代码我们可以看到set的两个功能:
1.set是一个无重复元素的集合,也就是会自动去除重复的元素。
2.set可以自动为我们排序,默认排序为升序。(高级的排序这里不做讲解)
set的常见使用函数
set的复杂度要比vector小,没有那么多的构造赋值什么的,所以直接将函数即可。
函数如下。
insert() 加入元素(插入元素)
size() 返回当前set容器中的元素个数
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
count() 用来查找set中某个键值出现的次数
erase() 删除元素
小总结:
1.set加入元素不像vector一样可以像使用数组一样加入元素,最方便利用insert插入元素。
2.begin()和end()的用法和vector差不多,但是注意set里面的begin()和end()不支持‘+'和 ‘-’运算符(自增自减可以),申请的迭代器也不行,也就数说,出现下面代码会报错。
s.begin() + 1;
s.begin() - 1;
s.end() - 1;
set<int> :: iterator ite = s.begin() + 2;
ite = ite + 2;
...等等相关操作
简单函数在原始代码中出现过,所以不做过多讲解。
count()函数
count()函数会返回某个键值(就是元素)出现的次数,由于set的去重特定,如果有某个元素,就只会返回1,如果没有,返回0。详情看代码(省略头文件)。
s.insert(1);
s.insert(2);
s.insert(4);
s.insert(3);
s.insert(1); //重复插入1
cout<<"s.count(1) = "<<s.count(1)<<endl; //查看1出现的次数
cout<<"s.count(0) = "<<s.count(0)<<endl; //查看0出现的次数
运行结果
1
0
erase()的用法
erase()的三种常用原形
1.erase(iterator) ,删除定位器iterator指向的值(删除这个地址的元素)
2.erase(first,second),删除定位器first和second之间的值(删除地址从first到second的元素(注意不包括second地址的元素))
3.erase(key_value),删除键值key_value的值()
具体适用方法请看代码
set<int> s;
//加入元素10 9 8 7 6 5 4 3 2 1
for(int i = 10;i>=1;i--){
s.insert(i);
}
//申请一个迭代器
set<int> :: iterator it;
//第一种删除
s.erase(s.begin()); //删除第一个元素 1;
cout<<"第一次删除的结果为:";
for(it = s.begin() ; it != s.end() ; ++it){
cout<<*it<<' ';
}
cout<<endl;
//第二种删除
s.erase(s.begin(),++s.begin()); //在上面删除的基础上删去元素 2(因为不包括地址++s.begin()的元素,所有只能删掉一个元素)
cout<<"第二次删除的结果为:";
fprintf("text.txt",)
for(it = s.begin() ; it != s.end() ; ++it){
cout<<*it<<' ';
}
cout<<endl;
//第三种删除
s.erase(5); //删除集合里的 5
cout<<"第三次删除的结果为:";
for(it = s.begin() ; it != s.end() ; ++it){
cout<<*it<<' ';
}
cout<<endl;
运行结果:
第一次删除的结果为:2 3 4 5 6 7 8 9 10
第二次删除的结果为:3 4 5 6 7 8 9 10
第三次删除的结果为:3 4 6 7 8 9 10
持续更新…(如有问题欢迎指正)