STL源码剖析(7)算法2
set算法
set有4个算法,交集,并集,补集和对称差集。这四个不能用于unordered_set系列的,只能接受set和multiset。
这四个方法都有两个版本,其中第二个版本可以自定义"<"比较符。我们只讨论第一个版本。
set_union
两个集合求并集。参数是两个区间和一个保存结果的begin迭代器,返回结果的尾迭代器。
OutputIter set_union(first1, last1, first2, last2, d_first);
具体的做法是依次比较两个集合
- 如果不相同就取小的,并且iter++
- 如果相同就取第一个的,并且两个的iter++
这种做法导致的结果是,multiset可能跟预想的不太一样。比如现在两个集合
- 1 3 5
- 1 1 2 3 5
求并以后是:1 1 2 3 5,两个1还是保留下来了,既不是1个也不是3个。
set_inteersection
集合求交集,同求并集,做法是
- 如果相同取第一个的,并且两个iter++
- 如果不同,小的那个iter++
同样,对于multiset表现是:同样的value,其交集出现的次数是min(n, m),n,m分别是两个集合中value出现的次数
set_difference
集合求差集,就是出现在集合1中,但是不出现在集合2中的元素。
对于某个值,在集合1中出现了n次,集合2中出现了m次,那么在差中会出现max(n-m,0)次。
- 如果相同则两个iter++
- 如果iter1大于iter2,iter2++
- 如果iter2大于iter1,取iter1,并且iter1++
set_symmetric_difference
对称差集:指的是要么出现在集合1(S1)要么出现在集合2(S2)中的元素。
对于有多个值的情况,最后的结果应该是|n-m|,区别于上面的max(n-m, 0)
- 如果相同两个iter++
- 如果不同,取小的那个,然后iter++
heap算法
push_heap
这个就是堆的插入元素,接受两个参数,表示堆的范围。具体操作是
- 插入到最后一个元素
- 进行shiftUp操作:跟父节点比,大的话就换上去,直到小于父亲,或者到顶了。
pop_heap
堆的删除操作,接受一个区间。
- 将最后一个元素换到对顶
- 对堆顶做一次shiftDown:跟儿子比,把大的那个儿子换上来,然后自己当儿子,继续操作,直到叶子。
sort_heap
堆排序。堆排序就是每次做一次堆,取出最大那个元素放到最后一个,调整堆的范围,继续调整成为堆。这样做n-1次,整个序列就是有序的了。
make_heap
堆的build算法,接受一个区间。具体做法是:从最后一个非叶子节点开始shiftdown
其他算法
数据处理
- adjacent_find:返回相邻的元素相等第一个
- count:统计
- count_if:统计满足条件的元素个数,if可自定义条件(仿函数),后面的if也一样
- find:查找区间中的元素,满足equality
- find_if:自定义查找条件
- find_end:在区间1中查找区间2出现的最后一次
- find_first_of:在区间1中查找区间2出现的第一次
- for_each 遍历执行某个函数,函数以仿函数的形式作为参数
- generate 将仿函数的结果复制到区间每个元素
- generate_n 指定起始迭代器和长度,其他同上
- includes:应用于有序,判断区间1是否包含区间2(不要求连续)
- max_element,min_element:求最大最小值
- merge:合并两个有序区间
- partition:传一个仿函数,满足条件的放在前面,不满足的放在后面
- remove:将所有值等于val的元素放到后面
- remove_copy:把移除后的放到一个新的容器中
- remove_if,remove_copy_if:这俩就是把上面的判别条件改成自定义的仿函数
- replace:将区间某些值替换成别的
- replace_copy:把替换后的放到新容器中
- replace_if,replace_copy_if:这俩if同上
- reverse:倒转区间
- reverse_copy:同上,结果保存到新的区间
- rotate:将firstmid和midlast的区间交换
- rotate_copy:同上,结果保存到新区间
- search:在区间1查找区间2,如果有则返回区间1的last
- search_n:查找连续n个元素满足条件
- swap_ranges:交换区间,可以同一容器也可不同,用户需要自己保证区间不重复
- transform:对每个元素操作一次op
- unique:移除相邻的重复的元素
- unique_copy:将区间复制到另一个区间,如果相邻的相同则只复制一个
二分
下面这些操作,必须在有序的区间上
- lower_bound:二分查找满足条件的第一个
- upper_bound:二分查找满足条件的最后一个
- binary_search:二分查找是否存在满足条件的
排列组合
- next_permutation 下一个排列
- prev_permutation 上一个排列

浙公网安备 33010602011771号