C++ 标准库在算法题里的使用
3164
2021.05.02
2021.05.04
发布于 未知归属地

今天的力扣周赛(第239场)第三题,看了大神的解答才知道,原来 C++ stl 里提供的有 next_permutation 函数,深感自己学艺不精。于是想在这里整理一下 C++ stl 在算法题里的使用。

下面的函数,如无特别说明,均在 里。
以及,下面只对提到函数进行最基本的介绍,如果想要了解更多,请参考cplusplus.comcppreference.com,或者 stackoverflow。
  1. next_permutation,prev_permutation
    作用:将容器内元素重新排序,转换至下一个排列或上一个排列。
    不想吐槽了,请去做这一道题:邻位交换的最小次数,做完这道题就知道这个函数怎么用了。就是因为这道力扣周赛第三题,才有了这篇文章。
  2. gcd、lcm(#include ,C++ 17)
    作用:求最大公因数、最小公倍数。
    请去做这一道题:水壶问题
    最近才知道 C++ stl 里提供的有这两个函数,自己当初手写了不知道多少次这两个函数。。。
    顺便一提,gcd不仅能用来求最大公因数,还常用在对精度要求极高的数学运算中,例如,用来保存直线斜率并判等(可以避免爆精度)。请去做这一道题:直线上最多的点数
  3. sort,stable_sort
    sort 差不多算是 stl 里用的最多的函数之一了,应该都知道吧,那 stable_sort呢。有些时候,排序时需要保持相等元素原来的次序,这时候就需要用到 stable_sort了。
  4. lower_bound,upper_bound,euqal_range
    用于对有序容器内的元素进行二分查找。这也是 stl 里用的最多的函数之一,应该都知道,就不多说了。
  5. reverse
    不想多说,用于反转容器内的元素。
  6. unique
    用于有序容器内重复元素的去除,常见用法:
vector<int> a{4, 1, 5, 1, 7, 1};
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
  1. min_element,max_element
    用于找容器中的最小、最大的元素,可以节省一两行代码,并提高代码的可读性。
  2. accumulate(#include
    用于容器元素的求和(可以提供自定义函数),可以节省一两行代码,并提高可读性。
    用法如下:
vector<int> a{1, 2, 3, 4, 5};
cout << accumulate(a.begin(), a.end(), 0);

上述代码等价于:

vector<int> a{1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < a.size(); ++i)
    sum += a[i];
cout << sum;
  1. is_permutation
    判断两个容器内的元素是否互为置换。在有些题目中(以字符串相关题目居多),可以节省5、6行代码。
  2. all_of,any_of,none_of
    不想解释,函数名就是函数的含义。虽然在算法题中用的不多,并且写出对应的函数,不过,应付老师布置的作业时倒是经常用到。
  3. lambda表达式
    lambda 表达式应该算是语法方面的内容,不过,在 stl 中频繁用到,刷算法题必备,还是专门为刚接触 C++,又碰巧看到这篇文章的学弟、学妹们提一下吧。不过,篇幅有限,这里不可能讲解 lambda 表达式的用法,还请移步其他专门的文章。
  4. 结构化绑定(C++ 17)
    非常好用的一个语法,不过,没接触过其他语言的 C++ 学生可能不知道这个语法,在这里提一下:
unordered_map<int, string> hash {{1, "a"}, {2, "b"}, {3, "c"}};
for (auto& [key, value] : hash)
    cout << key << ' ' << value << endl;
  1. iota(#include
    有时候会在别人的题解里看到,解释一下这个函数吧。
vector<int> v(10);
iota(v.begin(), v.end(), 10);

等价于:

vector<int> v(10);
int start = 10;
for (int i = 0; i < v.size(); ++i)
    v[i] = start++;

iota函数可以节省一两行代码,iota这个名字来源于希腊字母。
14. partition
按给定的条件,将容器内的元素分为两组。刷题时偶尔会用到。

写的比较匆忙,可能又不少错误,还请多多包涵。

评论 (1)