- 博客(19)
- 收藏
- 关注
原创 第九章 顺序容器
第九章 顺序容器 顺序容器概述 string 和 vector 将元素保存在连续的内存空间中,随机访问。 list 、forward_list 是链表,插入删除操作 O(1) ,顺序访问,额外内存开销也很大。 deque 支持快速随机访问,首位删除插入效率高。 array 是固定大小的数组,array不支持添加和删除元素以及改变容器大小的操作。 forward_ list 的设计目标是达到与最好的手写的单向链表数据结构相当的性能。因此,forward_list 没有 size() 操作。 容器库概览
2021-09-13 21:34:52
174
原创 第八章 io
第八章 IO io库类型和头文件 IO对象无拷贝或赋值 不能拷贝,因此不能将形参和返回类型设置为流类型。 通常以引用的方式传递和返回流。 读写一个IO对象会改变其状态,所以传递和返回的引用不能是const的。 ofstream out1, out2; out1 = out2; //错误,不能对流对象赋值 ofstream print(out1); //错误,不能初始化ofstream参数 out2 = print(out2); //错误,不能拷贝流对象 条件状态 IO 库定义了
2021-09-08 15:20:15
220
原创 并查集模板
并查集模板 主要用于处理一些不相交集合的合并问题,p[i] : i 所在集合的根节点,rank[i] : 以 i 为根节点展开的树的深度。 初始化:各元素自成一个集合,p[i] = i, rank[i] = 0。 find(x):找到元素 x 所在的集合的根节点。注意在查找过程中进行路径压缩。 union(x, y)(合并):把元素 x 和元素 y 所在的集合合并,要求 x 和 y 所在的集合不相交,如果相交则不合并。合并时候按 rank[x] 和 rank[y] 的大小合并。 /*==========
2021-09-04 15:54:47
155
原创 c++ primer 学习笔记 第七章 类
第七章 类 定义在类内部的是隐式的inline函数。 成员函数通过一个名为this的隐式参数来访问调用它的那个对象。 //names 类名。total 实例名 name total; total.isTrue(); //等价于 name::isTrue(&toatal); const关键字放在成员函数的参数列表之后,代表this是一个指向常量的指针,所指对象不可被更改。 类作用域与成员函数 首先编译成员声明,再编译成员函数,因此成员函数可以不用在意类内的成员的声明次序。 返回对象的引用。
2021-09-03 17:47:26
354
原创 快速幂模板
快速幂模板(仅作记录) 普通n次幂 using type_c = int; //类型为int; using ll = long long; #define mod 1000000000 type_c my_pow(type_c a, ll n){ if(n == 0) return 1; if(n % 2 == 0) return my_pow(a, n/2) * my_pow(a, n/2) % mod; else return a * my_pow
2021-08-29 17:10:17
283
原创 c++ primer 学习笔记 第六章
第六章 函数基础 函数执行的第一步是隐式的定义并初始化他的形参。 如果局部静态变量没有显式的初始值,他将执行值初始化,内置类型的局部静态变量初始化为零。 在头文件中进行函数声明,含有函数声明的头文件应该被包含到定义函数的源文件中。 使用引用避免拷贝,效率高,而且某些类类型不支持拷贝操作。如果函数无需修改引用形参的值,声明为常量引用。 温习----指针引用与const int i = 42; const int *cp = &i; //正确:但是cp不能改变i const int &r
2021-08-26 21:19:30
153
原创 c++ primer 学习笔记 第五章
第五章 空语句注意以下情况 while(iter != svec.end()) ; //while循环执行的是空语句 else 总是与最近的 if配套。 switch: 某个case匹配成功,则顺序执行后面的case语句,除非遇到显示中断。 如果在某处一个带有初值的变量位于作用域之外,在另一处改变量位于作用域之内,则从前一处跳转到后一处的行为是非法的。 case true: // 因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法
2021-08-25 20:50:36
168
原创 c++ primer 学习笔记 第四章
第四章 左值右值 当对象被用作左值的时候,用的是对象的身份(在内存中的位置);当一个对象被用作右值的时候,用的是对象的值(内容)。 使用关键字decltype时,如果表达式的求值结果是一个左值,decltype作用于该表达式(不是变量)得到一个引用类型。 int i = 4; const int j = 5; int arr[5] = { 0 }; int *ptr = arr; //表达式的结果为左值,推导为类型的引用 decltype((i)) var1 = i; /
2021-08-25 20:13:12
165
原创 树状数组模板
树状数组 在求解区间和的时候,使用前缀和数组,可以通过 sum[r] - sum[l-1]的操作O(1)求取sum[l, r] ,但是如果我们需要修改原数组,那么就得遍历一整个数组修改sum[i],O(n);如果用普通数组,反过来更新的时候O(1),但是求区间和的时间复杂度就变为O(n)了。 引入树状数组,可以在O(可以在O(可以在O(log2n\log_{2}{n}log2n )的时间复杂度下更新和求取区间和。 个人理解 原始数组A[1–N],树状数组C[1–N]。 标记为灰色的节点实际已被上层覆盖,
2021-08-22 19:05:13
120
原创 c++ primer 学习笔记 第三章
c++ primer 学习笔记 第三章 string string::size_type 大致为一个无符号整型数,应避免将string.size()得到的结果与有符号数进行混用。假设n是负值(int),那么s.size() < n 判定结果几乎将会肯定是true, 因为n会被转化为一个很大的无符号整数。 字符串字面值与string对象(这两个类型不同)相加时必须确保每个加法运算符两侧的运算对象至少有一个是string,重载+的时候必须有一个是string对象。 string s2 = s1 + "
2021-08-21 21:29:30
165
原创 c++ primer 第二章
第二章 变量定义 初始化与赋值 初始化不是赋值,初始化的含义是创建变量时赋予一个初始值。 赋值的含义是把对象的当前值擦除,以一个新值替代。 声明与定义的区别 声明:规定了变量的类型和名字。 定义:除声明之外,还需要申请存储空间。 如果想声明一个变量,而非定义它,需要使用extern关键词。 extern int i; // 声明i而非定义i int j; // 声明并定义j 变量只能被定义一次,但可以被多次声明。 变量命名规范 用户自定义类名一般以大写字母开头。
2021-08-19 21:46:02
214
原创 dijkstra(堆优化)
dijkstra(堆优化) 算法思想(根据一算法模板实现,仅作记录) Dijkstra算法采用的是一种贪心的策略,声明一个数组distt来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T(用vis数组来标记),preV存储路径前驱。 初始化,vis[i] = 0, dist[i] = INF,preV[i] = -1。创建一个优先队列q(小顶堆)来存储顶点结点,按dis大小排序。 起始点u入队,dist[u] = 0, vis[u] = 1,然后只要队不空且没找到所有结点的最
2021-08-17 13:36:23
861
原创 dijkstra(数组实现n²,带打印路径)
dijkstra(数组实现n²,带打印路径) 算法思想(参考某算法模板,不知道挂哪的链接,纯属记录) Dijkstra算法采用的是一种贪心的策略,声明一个数组lowcost来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T(用vis数组来标记),path存储路径前驱。 初始化,vis[i] = 0, lowcost[i] = INF, cost[i] [j] = INF, cost[i] [i] = 0。 初始时,lowcost[beg] = 0,vis[beg] = 1, pat
2021-08-15 21:32:07
258
原创 无向图找桥
无向图找桥 算法思想: 设置vis, pre, anc数组。 pre[cur]:cur结点dfs时访问时的时间’。 anc[cur]: 记录cur结点及其子孙结点最早祖先的dfs时间(朔源到尽头)。 vis标记结点访问状态:0:未访问, 1:正在访问, 2:访问结束。 访问当前结点cur时,通过其子孙递归的更新其最早祖先的dfs时间,找出所有桥。dfs过程中,其孩子节点child如果还未开始访问则child为树边,递归;若已经开始访问且未结束,且不是cur父亲,则此节点为cur的祖先,可以更新an
2021-08-13 12:36:23
395
原创 无向图连通度(割)
无向图连通度(割) 算法思想 观察 dfs 搜索树,我们可以发现有两类节点可以成为割点: 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点; 对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。 设置vis, pre, anc数组,cnt记录dfs树中的孩子个数。 pre[cur]:cur结点dfs时访问时的时间’。 anc[cur]: 记录cur结点及其子孙结点最早祖先的dfs时间(朔源到尽头)。
2021-08-13 12:35:50
772
原创 第k短路(A*)
第k短路(A*) A*算法思想 广度优先搜索:以广度做为优先级进行搜索。从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点,时间空间开销大。 深度优先搜索:每次沿着特定规则走,纵向寻找答案,找到答案的时机视具体情况而不同。 对比:假如深度优先在搜索的时候恰好第一次搜索就是正确路径,这个效率就很高,而广度优先是不做决策,同步进行。那么我们有没有办法使得算法在搜索的时候有目的的去搜索呢?答案是肯定的。 启发式搜索(A*) 给出一个估价函数:g(n) = f(
2021-08-13 12:35:17
173
原创 DAG 的深度优先搜索标记
DAG 的深度优先搜索标记 邻接矩阵版 /*==================================================*\ | DAG 的深度优先搜索标记 | INIT: edge[][]邻接矩阵; pre[], post[], tag全置0; | CALL: dfstag(i, n); pre/post:开始/结束时间 \*==================================================*/ /* 注意:发起点——>接受点,中间-
2021-08-13 12:34:54
444
原创 ccf——201312-5 I’m stuck!
问题描述 给定一个R行C列的地图,地图的每一个方格可能是’#’, ‘+’, ‘-’, ‘|’, ‘.’, ‘S’, 'T’七个字符中的一个,分别表示如下意思: ‘#’: 任何时候玩家都不能移动到此方格; ‘+’: 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#'方格移动一格; ‘-’: 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非’#'方格移动一格; ‘|’...
2020-02-29 21:15:41
179
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅