set
翻译为集合,是一个内部自动有序且不含重复元素的容器,在使用时需加上 set 头文件,即 #include <set>
,并在头文件下加上 “using namespace std;
”。
1. set 的定义
set<typename> name;
即:set 数据类型 名称
typename 可以是任何基本类型,例如 int, char, double, 结构体, STL 容器。
大部分 STL 都是这样定义的。
2. set 容器内元素的访问
set 只能通过迭代器(iterator)访问:
set<typaname>::iterator it;
由于除开 vector 和 string 之外的 STL 容器都不支持*(it+i)的访问方式,因此只能按以下方式枚举:
///set容器实现元素自动递增排序且自动去除重复元素
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
st.insert(3) ;
st.insert(5) ;
st.insert(2) ;
st.insert(3) ;
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
//不支持it < st.end()的写法
printf ("%d ", *it) ;
}
return 0 ;
}
3. set 常用函数实例解析
(1) insert()
//insert():将 x 插入 set 容器中,并自动递增排序且去除重复元素
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
st.insert(3) ;
st.insert(5) ;
st.insert(2) ;
st.insert(3) ;
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
//不支持it < st.end()的写法
printf ("%d ", *it) ;
}
return 0 ;
}
(2) find()
//find(value):返回 set 中对应值为 value 的迭代器(即在其中是第几个元素)
#include <cstdio>
#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) ;
printf ("%d\n", *it) ;
//以上两句可直接写成 printf ("%d\n", *(st.find(2)))
return 0 ;
}
(3) erase()
i) 删除单个元素
- st.erase(it):it 为 find(value) 找到要删除元素的迭代器
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
st.insert(100) ;
st.insert(200) ;
st.insert(300) ;
st.erase(st.find(100)) ;
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf ("%d ", *it) ;
}
return 0 ;
}
- st.erase(value):直接删除 set 中值为 value 的元素
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
st.insert(100) ;
st.insert(200) ;
st.insert(100) ;
st.erase(100) ;
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf ("%d ", *it) ;
}
return 0 ;
}
ii) 删除一个区间内的所有元素
//删除区间 [first, last] 内元素:st.erase(first, last+1)
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
st.insert(2) ;
st.insert(1) ;
st.insert(4) ;
st.insert(3) ;
st.erase(st.find(3), st.end()) ;
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf ("%d ", *it) ;
}
return 0 ;
}
(4) size()
//size():获得 set 内元素的个数
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
st.insert(1) ;
st.insert(2) ;
st.insert(3) ;
st.insert(4) ;
printf ("%d", st.size()) ;
return 0 ;
}
(5) clear()
//clear():用以清空 set 中的所有元素
#include <cstdio>
#include <set>
using namespace std;
int main () {
set<int> st ;
for (int i = 1; i <=4; i++) {
st.insert(i) ;
}
st.clear() ;
printf ("%d", st.size()) ;
return 0 ;
}