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 上一个排列
posted @ 2022-08-04 12:04  Destiny233  阅读(58)  评论(0)    收藏  举报