总结
1)set 就是一个有序的集合
2)怎么定义STL容器除了string特殊,其他定义方法一样
set<typename> name;
3)访问,只能用迭代器访问
4)也有begin(),和end()+ 5个函数
- insert()
- size()
- find()
- erase()
- clear()
什么是set?
set就是一个集合,官方的说就是一个内部有序且不含重复元素的容器。
使用+头文件
#include<set>
using namespace std;
1,set的定义
set<typename> name;
其余写法给vector一样,大部分STL容器都是这样定义。
set<int> name;
set<char> name;
set<double> name;
set<node> name;
定义数组
set<typename> Arrayname[arraySize];
例如
set<int> a[100];
Arrayname[0] ~ Arrayname[arraySize - 1]中的每一个都是set容器
2,set的访问
set 只能用 迭代器访问
set<typename>::iterator it;
并且可以通过 * it 来访问set里面的元素。
由于除开vector 和 string 之外的STL容器都不支持*(it + i)的访问方式,因此只能用以下方式枚举
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
st.insert(3);
st.insert(5);
st.insert(7);
st.insert(2);
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
cout << *it << " ";
}
return 0;
}
常用函数
(1)inset()
将x插入set 容器中,并进行自动递增排序去重,时间复杂度O(logN)N为set内元素的个数。
(2)find()
find(value)返回set中对应值的value 的迭代器,时间复杂度为 O(logN)N为set内元素的个数。
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
for(int i = 1; i <= 3; i++){
st.insert(i);
}
set<int>::iterator it = st.find(2);
cout << *(it) << endl;
return 0;
}
如果找不到,超出set.size()的范围就会返回set.size()
(3)erase()
还是两种用法
- 删除单个元素(2种方法)
- 第一种
st.erase( it ), it为所需要删除元素的迭代器,时间复杂度为O(1),可以结合find()函数来用
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
for(int i = 1; i <= 9; i++){
st.insert(i);
}
st.erase(st.find(5));
st.erase(st.find(8));
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
cout << *it << " ";
}
return 0;
}
- st.erase(value),value为所需要删除元素的值,时间复杂度为 O(logN) N为set元素的个数
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
for(int i = 1; i <= 9; i++){
st.insert(i);
}
st.erase(3);
st.erase(7);
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
cout << *it << " ";
}
return 0;
}
- 删除一个区间内的所有元素
set.erase(first, last)可以删除一个区间内所有的元素,其中first为所需要删除区间的起始迭代器,而last 则为所需要删除区间的末尾迭代器的下一个位置地址。就是删除,[ first, last ) 时间复杂度 O(last - first)。
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
st.insert(10);
st.insert(40);
st.insert(20);
st.insert(30);
set<int>::iterator it = st.find(30);
st.erase(it, st.end()); //st.erase(it, st.find(40))答案不一样,助于理解
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
cout << *it << " ";
}
return 0;
}
set 容器不允许 it + 数字,
只有 vector和 string 允许
(4)size()
用来获取set内元素的个数,时间复杂度为O(1)
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
st.insert(10);
st.insert(40);
st.insert(20);
st.insert(30);
cout << st.size() << endl;
return 0;
}
(5)clear()
清空所有元素时间复杂度为 O(N)
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main(){
set<int> st;
st.insert(10);
st.insert(40);
st.insert(20);
st.insert(30);
st.clear();
cout << st.size() << endl;
return 0;
}