STL常用工具

目录

  • 一、heap
  • 二、string
  • 三、queue与priority_queue
  • 四、deque(双端队列)
  • 五、set, map, multiset, multimap
  • 六、unordered_set, unordered_map, unordered_multiset, unordered_multimap
  • 七、vector
  • 八、查找函数
  • 九、sort

一、heap

头文件:

总览:

make_heap():用于把一个可迭代容器变成一个堆,默认是大顶堆;
push_heap():对heap增加一个元素;
pop_heap():对heap取出下一个元素;
sort_heap():对heap转化为一个已排序群集。

make_heap():

它有三个参数。第一个参数是指向开始元素的迭代器,第二个参数是指向最末尾元素的迭代器,第三个参数是less<>()或是greater<>(),前者用于生成大顶堆,后者用于生成小顶堆,第三个参数默认情况下为less<>(),less()用于生成大顶堆。

push_heap():

push_heap()用于把数据插入到堆中,它也有三个参数,其意义与make_heap()的相同,第三个参数应与make_heap时的第三个参数保持一致。

注意:在使用push_heap()前,请确保已经把数据通过q.push_back()传入q中,而不是在push_heap()后再使用q.push_back(t)。

pop_heap():

pop_heap()用于将堆的第零个元素与最后一个元素交换位置,然后针对前n - 1个元素调用make_heap()函数,它也有三个参数,参数意义与make_heap()相同,第三个参数应与make_heap时的第三个参数保持一致

注意:pop_heap()函数,只是交换了两个数据的位置,如果需要弹出这个数据,请记得在pop_heap()后加上q.pop_back()。如:pop_heap(a.begin(), a.end()); a.pop_back();

sort_heap():

sort_heap()是将堆进行排序,排序后,序列将失去堆的特性(子节点的键值总是小于或大于它的父节点)。它也具有三个参数,参数意义与make_heap()相同,第三个参数应与make_heap时的第三个参数保持一致。大顶堆sort_heap()后是一个递增序列,小顶堆是一个递减序列。

注意:请在使用这个函数前,确定序列符合堆的特性,否则会报错!

二、string

总览:

strcmp():比较字符串;
substr():求子串;
stoi():将字符串转换为int
to_string():将数值类转换为字符串;

三、queue与priority_queue

queue:
size()
empty()
push(): 向队尾插入一个元素
front(): 返回队头元素
back(): 返回队尾元素
pop(): 弹出队头元素

priority_queue:
size()
empty()
push(): 插入一个元素
top():返回堆顶元素
pop():弹出堆顶元素
定义成小根堆的方式:priority_queue, greater> q;

四、deque(双端队列)

size()
empty()
clear()
front()/back()
push_back()/pop_back()
push_front()/pop_front()
begin()/end()
[]

五、set, map, multiset, multimap

基于平衡二叉树(红黑树),动态维护有序序列

size()
empty()
clear()
begin()/end()
++, -- 返回前驱和后继,时间复杂度 O(logn)

set/multiset:

insert():插入一个数
find():查找一个数
count():返回某一个数的个数
erase()
(1) 输入是一个数x,删除所有x O(k + logn)
(2) 输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound():
lower_bound(x):返回大于等于x的最小的数的迭代器
upper_bound(x):返回大于x的最小的数的迭代器

map/multimap:

insert():插入的数是一个pair
erase():输入的参数是pair或者迭代器
find()
[]:注意multimap不支持此操作。 时间复杂度是 O(logn)
lower_bound()/upper_bound()

六、unordered_set, unordered_map, unordered_multiset, unordered_multimap

  • 和上面类似,增删改查的时间复杂度是 O(1)
  • 不支持 lower_bound()/upper_bound(), 迭代器的++,–

七、vector

vector, 变长数组,倍增的思想

size():返回元素个数
empty():返回是否为空
clear():清空
front()/back()
push_back()/pop_back()
begin()/end()
[]
支持比较运算,按字典序

八、查找函数

Tips:

  • 二分查找结束后,l == r
  • STL中几个查找函数:这些函数适用于所有的序列式容器,且寻找的都是子串不是子序列,注意描述!
类别 函数 功能
顺序查找 find() 用于在指定范围内查找和目标元素值相等的第一个元素
find_if() 根据指定的查找规则,在指定区域内查找第一个符合该函数要求(使函数返回 true)的元素
find_if_not() 用于查找第一个不符合谓词函数规则的元素
find_end() 在序列 A 中查找序列 B 最后一次出现的位置
find_first_of() 在 A 序列中查找和 B 序列中任意元素相匹配的第一个元素
search() 用于在序列 A 中查找序列 B 第一次出现的位置
search_n() 用于在指定区域内查找第一个包含多个相同元素的子序列
二分查找 lower_bound() 用于在指定区域内查找大于等于目标值的第一个元素
upper_bound() 在指定范围内查找大于目标值的第一个元素
equal_range() 在指定范围内查找等于目标值的所有元素
binary_search() 用于查找指定区域内是否包含某个目标元素

顺序查找:均在头文件

  1. InputIterator find (InputIterator first, InputIterator last, const T& val);:用于在指定范围内查找和目标元素值相等的第一个元素。该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素(不是元素的下标);如果查找失败,则该迭代器的指向和 last 相同。
  2. InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);:根据指定的查找规则,在指定区域内查找第一个符合该函数要求(使函数返回 true)的元素。当查找成功时,该迭代器指向的是第一个符合查找规则的元素;反之,如果 find_if() 函数查找失败,则该迭代器的指向和 last 迭代器相同;
  3. InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);:用于查找第一个不符合谓词函数规则的元素。当查找成功时,该迭代器指向的是第一个符合查找规则的元素;反之,如果 find_if() 函数查找失败,则该迭代器的指向和 last 迭代器相同;
  4. ForwardIterator find_end (ForwardIterator first1, ForwardIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate pred);:在序列 A 中查找序列 B 最后一次出现的位置。函数会返回一个正向迭代器,当函数查找成功时,该迭代器指向查找到的子序列中的第一个元素;反之,如果查找失败,则该迭代器的指向和 last1 迭代器相同;
  5. InputIterator find_first_of (InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate pred);:在 A 序列中查找和 B 序列中任意元素相匹配的第一个元素。 函数会返回一个正向迭代器,当函数查找成功时,该迭代器指向查找到的子序列中的第一个元素;反之,如果查找失败,则该迭代器的指向和 last1 迭代器相同;
  6. ForwardIterator search (ForwardIterator first1, ForwardIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate pred);:用于在序列 A 中查找序列 B 第一次出现的位置。函数返回一个正向迭代器,当函数查找成功时,该迭代器指向查找到的子序列中的第一个元素;反之,如果查找失败,则该迭代器的指向和 last1 迭代器相同。这里的寻找实质上找的是子串。
  7. ForwardIterator search_n ( ForwardIterator first, ForwardIterator last, Size count, const T& val, BinaryPredicate pred );:用于在指定区域内查找第一个包含多个相同元素的子序列。search_n() 函数会返回一个正向迭代器,当函数查找成功时,该迭代器指向查找到的子序列中的第一个元素;反之,如果查找失败,则该迭代器的指向和 last 迭代器相同。

二分查找:均在头文件中,仅适用于查找有序区域

  1. ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);:用于在指定区域内查找大于等于目标值的第一个元素。该函数会返回一个正向迭代器,当查找成功时,迭代器指向找到的元素;反之,如果查找失败,迭代器的指向和 last 迭代器相同;
  2. ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);:在指定范围内查找大于目标值的第一个元素。该函数会返回一个正向迭代器,当查找成功时,迭代器指向找到的元素;反之,如果查找失败,迭代器的指向和 last 迭代器相同;
  3. pair equal_range (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);:在指定范围内查找等于目标值的所有元素;
    注意: 该函数会返回一个 pair 类型值,其包含 2 个正向迭代器。
    • 当查找成功时:第 1 个迭代器指向的是 [first, last) 区域中第一个等于 val 的元素;第 2 个迭代器指向的是 [first, last) 区域中第一个大于 val 的元素;
    • 如果查找失败,则这 2 个迭代器要么都指向大于 val 的第一个元素(如果有),要么都和 last 迭代器指向相同。
  4. bool binary_search (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);:用于查找指定区域内是否包含某个目标元素。该函数会返回一个 bool 类型值,如果 binary_search() 函数在 [first, last) 区域内成功找到和 val 相等的元素,则返回 true;反之则返回 false。

九、sort

你可能感兴趣的:(c++)