set是 stl 的一个关联容器,名叫“集合”,何为“集合”?其实就是一个数组,但有了数组何必还需集合,这是一个高深的问题。
目录
一、简介
1.空间复杂度
map 类似于 vector,可以随时创建新的元素,避免浪费过多空间,具体实现如下:
pair<iterator,bool> insert(const value_type& __v)
{return __tree_.__insert_unique(__v);}
2. 与 vector 相比
优点:
set 可以直接查找值,只需要 O(log n) 的时间复杂度,而 vector 不但需要手写查找函数,时间复杂度还达到了 O(n)。
缺点:
vector 更类似数组,因此按下表访问时只需要 O(1) 的时间复杂度,而 set 根本没有下标,只能按值搜索。
综合:
set 适合用作桶,非常节省空间。vector则用作数组,它可以说与数组比较是只有优点,没有缺点。可见各有各的优点和缺点。
二、 set 用法
1.声明 set
首先需要引用 “set” 头文件,如下:
#include <set>
声明时和一般模版类的声明方式一样,先注明类型(即 set )再填写模版,最后为变量名。例如:
set <int> s;
2.新增“元素”
我们可以使用 “insert” 函数,如下:
s.insert(1);
三、map 遍历
1.使用 “iterator”
“iterator” 中文名为“迭代器”,访问方式如下:
for(set <int>::iterator it = s.begin();it != s.end();++ it)
{
cout << *it;
}
由于 it 是一个指针所以需要加 “*” 访问。
2.使用 “auto”
c++11 以后,新增了一种 for 循环语法(如下), vector、list 等容器也可以这么访问。
for (auto i : v)
{
}
四、关于 set 的函数
1.find
查找 x 在 set 中的位置,若不存在这个键返回 “s.end()”,各自返回指针,如下:
cout << s.find(x);
2.clear
清空 set,vector 等容器也有这个函数,如下:
s.clear();
3.erase
清除一个元素,或从 “begin” 到 “end” 的所有元素,注意参数需为指针,如下
s.eraser(s.find(x));
s.eraser(begin,end);
若在循环中,需要更新迭代器:
for (set<int>::iterator it = s.begin();it != s.end();++ it);
it = s.erase(it);
}
4.empty
查看 set 是否为空,如下:
if(s.empty()) cout << "Yes";
5.swap
交换两个 set,如下:
s.swap(temp);
6.count
查找 x 在 set 中出现了几次,由于 set 不允许相同元素出现,所以返回值非 0 即 1,如下:
cout << s.count(x);
你学会了吗?