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