数据结构定义

struct ListNode {
int val;
ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {}
};
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

sort() 自定义比较函数

  • 由于容器支持的迭代器类型必须为随机访问迭代器,sort() 只支持array、vector、deque 这 3 个容器。

自定义排序方法

  • 缺点:定义的函数只能接受两个参数,就是比较的双方。无法根据 b 数组中元素的大小,来对 a 数组进行排序
bool cmp(int a, int b) {
// 降序
return a > b;
} int main() {
vector<int> arr{1, 3, 4, 2, 9, 0};
sort(begin(arr), end(arr), cmp);
for (auto i: arr) {
cout << i << " ";
}
}

lambda 表达式

结构:[capture list](parameter list) ->return type {function body}

其中,parameter list(参数列表)function body(函数体)与上面的cmp函数没有什么差异。return type虽说必须尾置,但通常可以省略。而capture list(捕获列表)中可以填写作用域中的参数,使它在 lambda 表达式内部可见。这就解决了上面的第二个问题。比如说,我们要捕获b数组,就写成[&b]即可(&代表引用捕获),也就是说捕获列表使 lambda 表达式可以使用不限量的外部参数,当然,如果不想指定捕获哪些,直接写[&],就是全部引用捕获。同时,哪里用到,就写在哪里,还不用起名字(所以也叫匿名函数),使它既直观又方便。

// 按照string的长度对string序列排序
sort(vec.begin(),vec.end(),[](auto &s1,auto &s2){return s1.size()<s2.size();}); // 按照pair的second大小降序排序,如果相同再按first升序排序
sort(vec.begin(),vec.end(),[](auto &p1,auto &p2){return p1.second==p2.second?p1.first<p2.first:p1.second>p2.second;})
int main() {
vector<int> flag = {2, 3, 5, 4, 1, 8, 7, 9, 6};
vector<int> index = {0, 1, 2, 3, 4, 5, 6, 7, 8};
// 根据flag数组中的元素大小,来对index数组(index对应着flag的下标)进行排序
sort(index.begin(), index.end(), [&flag](int a, int b) { return flag[a] < flag[b]; });
for (int i: index)
cout << i << " ";
return 0;
}
int main() {
vector<int> vals = {2, 4, 1, 2, 2, 5, 3, 4, 4};
vector<vector<int>> edges = {
{0, 1},
{2, 1},
{0, 3},
{4, 1},
{4, 5},
{3, 6},
{7, 5},
{2, 8}
};
// vals[i] 表示顶点 i 的值,edges[i][0]、edges[i][1] 为边的两个顶点
// 根据边的两个顶点的较大值进行排序
sort(begin(edges), end(edges),
[&vals](vector<int> v1, vector<int> v2) {
return max(vals[v1[0]], vals[v1[1]]) < max(vals[v2[0]], vals[v2[1]]);
});
for (int i = 0; i < edges.size(); ++i) {
cout << edges[i][0] << " " << edges[i][1] << endl;
}
}

二维数组初始化

vector<vector<int>> graph(10, vector<int>(10));

随机数

rand()

  • 返回一个随机数值,范围在[0, RAND_MAX]之间。RAND_MAX 定义在 stdlib.h 头文件中,C++中可以使用 cstdlib 头文件。

  • rand() 产生的是伪随机数,每次执行的结果是相同的

srand()

  • 用来设置 rand() 产生随机数时的随机种子,参数 seed 必须是整数,如果每次 seed 设置都相同,rand() 产生的随机数同样也相同
int main() {
// 返回系统的当前日历时间,自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 -1。
cout << time(NULL) << endl;
// 若给定参数,则将当前时间保存到该参数中;若不给定参数,参数填NULL。
time_t t;
cout << time(&t) << endl;
cout << t << endl;
// 三个输出结果都一样
}
int main() {
cout << "RAND_MAX:" << RAND_MAX << endl;
// 避免每次生成固定的随机数
srand((unsigned) time(NULL));
for (int i = 0; i < 10; i++)
cout << rand() << endl;
}

产生指定范围的随机数

int main() {
int a = 3, b = 23;
// 起始位置
int start = a;
// 范围长度
int len = b - a + 1;
// [a, b)
cout << (rand() % (len - 1)) + start << endl;
// [a, b]
cout << (rand() % len) + start << endl; // [0, 1] 的浮点数
cout << rand() / (double) (RAND_MAX) << endl;
}

注意事项

  • 题目给的数据范围,是否要用 long,尤其是要取模运算的题目,中间结果要用 long
  • resize(n, val):新增出来的位置才会设置成值 val
  • 注意是无向图还是有向图,无向图要加两条边
  • 链式前向星建图时,对于无向图,nxt、to、weight 数组大小设置两倍边数加一

C++刷题小知识点的更多相关文章

  1. 为了考PMP,我做了一个刷题小程序

    一.背景 1.我是一名软件工程师,技术出身,担任开发组长,对项目管理不是很熟,所以决定系统学习下项目管理. 2.全球最适合的项目管理学习课程就是PMP,每年有4次PMP考试,证书还是很有含金量的. 3 ...

  2. ACM 刷题小技巧【转】

    转载自URl-team ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好 ...

  3. 刷题小tips

    自从认真做题以后,结合自己的做题体验以及网上前人的总结经验贴,罗列下列的小建议: 1.为了避免每一次都要重复输入测试数据的麻烦,利用输入重定向文件 我是只把标准输入stdin重定位到in.txt,然后 ...

  4. noip2012~2015刷题小记录

    2012d1t1 密码 模拟题 #include<cstdio> #include<cstdlib> #include<cstring> #include<c ...

  5. 2021最新 Spring面试题精选(附刷题小程序)

    推荐使用小程序阅读 为了能让您更加方便的阅读 本文所有的面试题目均已整理至小程序<面试手册> 可以通过微信扫描(或长按)下图的二维码享受更好的阅读体验! 目录 推荐使用小程序阅读 1. S ...

  6. 超星尔雅看课刷题小tips

    用chrom浏览器,先安装扩展程序Tampermonkey BETA 然后进入> https://greasyfork.org/zh-CN 找一款适合自己的脚本安装即可刷课.

  7. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  8. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  9. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  10. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

随机推荐

  1. 陆吾AI智能机械狗的通讯控制

    陆吾AI智能机械狗现在是蛮有名的了,在YouTube上比较火的一个东西了,和波士顿机器狗不同,波士顿机器狗价格昂贵主要原因是其定位于工业领域的机械狗因此采用的是工业级的硬件,但是如果我们采用的家用环境 ...

  2. Git 学习笔记——git checkout

    上图是我对git常用用法的一个总结,今天这里主要解释上面操作中没有的 " git checkout "操作. =================================== ...

  3. Apache DolphinScheduler 3.1.8 保姆级教程【安装、介绍、项目运用、邮箱预警设置】轻松拿捏!

    概述 Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度开源系统.适用于企业级场景,提供了一个可视化操作任务.工作流和全生命周期数据处理过程的解决方案. ...

  4. 数据结构 分块 & 莫队

    分块 一种优化暴力的思想. 通常是将原数据划分成适当块(一般为 \(\sqrt{n}\)),对每块数据进行预处理,进而达到比暴力更优的时间复杂度. 划分 确定块长后,一般需要开两个数组存储每一块的右边 ...

  5. 基于 token 的登陆系统的实现

    这是一段防爬代码块,我不介意文章被爬取,但请注明出处 console.log("作者主页:https://www.cnblogs.com/Go-Solo"); console.lo ...

  6. 减小code体积的书写习惯

    1. 减少使用switch 2. 函数内部尽量使用内部变量,减少使用全局变量的次数 void func(void){ uint32_t sysclk; ... // 其他代码 rccClocks.SY ...

  7. JavaScript设计模式样例十七 —— 迭代器模式

    迭代器模式(Itrator Pattern) 定义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示.目的:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示.场景:$ ...

  8. C++开发分类

    1.基础架构 2.音视频领域 3.安全方向 4.Linux虚拟化 5.Qt客户端.上位机 6.游戏领域 7.嵌入式 8.量化券商 暂时对基础架构.音视频和安全方向较为感兴趣.

  9. java_类属性&对象属性

    访问类属性方式有两种: 对象.类属性 类.类属性 但是理解上第一种方法存在小小小问题, 逻辑没问题 2022年7月31日18:44:29

  10. Android Adapter中组件EditText文本变化监听 addTextChangedListener

    问题背景:使用适配器显示一个列表,列表中Item中有EditText,滚动时会有EditText组件内容消失 步骤: 1. 在Adapter中,添加interface public interface ...