STL中的set
set原理
set封装了很多复杂的数据结构和算法以及大量的操作。Vector封装了数组,list封装了链表,map和set封装了二叉树。并且又对编程提供了统一的操作。
set是关联式容器,内部也是一个平衡检索二叉树(红黑树RB),是容器也能存储相同类型的数据结构,并且set中的元素值都是唯一的。并且会自动进行排序。注意set中元素的值不能直接被改变
-> 关联式容器如下图
说明
- set插入和删除的效率比用其它序列容器要高。因为关联式容器不会做内存的拷贝和移动。只有指针的转换所以很快
- 每次插入之后,以前保存的iterator不会失效,原因是同样的,内存没有移动。也vector不同,因为vector每次删除和插入都可能要操作内存也可能push_back空间不足重新申请新的都有可能更改指针。切记不要使用过期的iterator
- 查找用的是二分查找时间复杂度为logn
常用操作
- begin() 返回第一个元素
- end() 返回最后一个元素
- clear() 删除set集合的所有的元素
- empty() 判断是否为空 begin()和end()是不是检查是否为空的所以自己要做一个判断
- count()判断每个键值出现的次数
- max_size() 返回最大的元素个数
- size() 返回当前set容器中所有元素的个数
- rbegin() 返回和end()一样的值 r是反向的意思
- rend() 返回和begin()一样的值
- insert() 插入元素,可以插入一个容器如:insert(ivec.begin(), ivec.end())
- erase() 删除指定的元素
- find() 若找到就返回迭代器的位置,如果没有返回最后一个值
- set set1; //创建一个名为set1的空set对象,其键类型为k
set set2(set1); //创建set1的副本set2,set2与set1必须有相同的键类型和值类型
set set3(b, e); //创建set类型的对象set3,存储迭代器b和e标记的范围内所有元素的副本。元素的类型必须能转换为k类型
- lower_bound() 返回指向大于或等于某值的第一个元素的迭代器
- upper_bound() 返回大于某个元素的迭代器
- swap() 交换两个集合
相关代码
class Solution {
public:
int numJewelsInStones(string J, string S) {
int res = 0;
set<char> setJ(J.begin(), J.end());
for (char s : S) if (setJ.count(s)) res++;
return res;
}
};
-> 开始就是做,别停在说上。工作内容很杂,但是自己一定要用自己专长一点的东西。