C++源码运行
前言由于经常接触编译期,运行期,链接期,在此简单记录C++从源代码到可执行文件的过程 🧩 1. 预处理阶段(Preprocessing)时机:编译前,由预处理器执行任务: 处理 #include, #define, #ifdef 等指令 宏展开、条件编译、文件合并 结果:生成一个单一的、纯 C++ 源码文件(无宏、无包含指令)。 ✍️ 我的思考: 我们熟悉的头文件插入就是在这里完成的。 🛠️ 2. 编译阶段(Compilation)时机:预处理后,由编译器执行任务: 语法分析、语义检查(如类型检查) 每个 .cpp 文件编译为目标文件(.o 或 .obj) 生成机器指令,但尚未解析符号 结果:每个源文件变成一个目标文件 关键词:编译期错误(如语法错误、类型不匹配) ✍️ 我的思考: 类似于对代码做一遍检查,在把代码整理成指令串的同时看看有没有错误。 例如,对没有虚函数的类进行`dynamic_cast`就会在这里报错 🔗 3....
二叉树基础
二叉树概念满二叉树二叉树是是一种每个节点不断二分出左子节点和右子节点的树状数据结构,在算法竞赛中常常使用。 其优势在于,当二叉树的平衡性维护的较好(即左子节点的复杂度和右子节点的复杂度大致相仿)时,访问二叉树上的某个节点只需要$O(logN)$的时间复杂度,非常方便。 另外,二叉树比较适合完成从局部到整体的转变,从某个树上节点,一直向上追溯根节点并修改值,具有代表性的是线段树这一数据结构,修改子节点的值之后通过递归修改根节点的值。 但当二叉树不平衡时,访问某个节点的时间就会增加。极端情况下,一棵二叉树会退化成链表,此时访问的时间复杂度是$O(N)$ 我们用一个例题来看一下一棵满二叉树如何建成 P4715 【深基16.例1】淘汰赛 这里采用递归建树,按照题意不断把胜者放到根节点,得到最终结果。 递归建树是一种比较常见的方式,因为我们往往先拥有子节点,再依据子节点去更新根节点。 1234567891011121314151617181920212223242526272829#include<iostream>#include <vector>using...
Python基础:语法
谨以此博客记录入门Python的笔记 变量字符串12345name = " a "print(name)print(name.rstrip()) # 去除左侧空格print(name.lstrip()) # 去除右侧空格print(name.strip()) # 去除两侧空格 小数在python中,输出小数会碰到这样奇怪的事情:12print(3*0.1)输出:0.30000000000000004这与计算机计算浮点数的方法有关为解决这个问题,引入格式化输出 格式化输出12a =...
线段树详解
...
C++:虚函数和类型转换
虚函数类似于静态函数,类的成员函数也可以被定义为虚函数。1234class A{public: virtual void function(){}};定义为虚函数之后,编译器会被显式告知这是一个多态函数,将会在派生类中被重写。 多态的意思是,这个函数在基类和派生类当中是不一样的。通过基类对象和派生类对象调用出的函数不一样。 那么,这种写法和直接在派生类中重写一个同名函数有什么区别呢? 区别在于,假如是重写一个同名函数,调用如下: 1234567891011121314151617181920212223class A{public: void function(){ cout<<"A\n"; }};class B:public A{public: void function(){ cout<<"B\n"; }};int...
基本算法
二分法引入力扣209. 长度最小的子数组前缀和+二分查找 12345678910111213141516171819202122232425262728class Solution {public: int minSubArrayLen(int target, vector<int>& nums) { int n=nums.size(); vector<int>sum={0,nums[0]}; for(int i=1;i<n;i++){ sum.push_back(sum[i]+nums[i]); } int minLen=n,flag=0; for(int i=0;i<=n;i++){ int r=n,l=1; while(l<=r){ int m = r -...
C++:类的继承
...
Python基础:环境配置
conda环境配置conda环境是python中相当于工具包的一个存在,因为python的使用中需要调用大量的库。不同的库之间难免有版本冲突和不同的Python版本依赖。 为了解决这个问题,Python开发者提出了conda环境的概念,可以把库和python版本安装到虚拟环境中,运行时在不同的Python虚拟环境里面运行即可。 步骤如下: 安装Anaconda 找到Anaconda Prompt 打开Anaconda Prompt,创建自己的新环境,配置python版本 现在以python3.11为例,math是这个环境的名字 1conda create -n math python=3.11 后续激活操作后续可以在Anaconda Prompt中或者其他编译器的Python控制台输入下列指令去激活环境12345# To activate this environment, use $ conda activate math# To deactivate an active environment, use $ conda deactivate 镜像源配置123conda...
高级数据结构(未完)
并查集模板题:此题非常经典,是不带权的并查集模板 P1551 亲戚注意:合并是把根节点合并,不是中途合并,不然会发生断路123456789101112131415161718192021222324252627282930313233343536#include<bits/stdc++.h>using namespace std;int n,m,p;int totalSet[5005];int find_set(int a){ if(totalSet[a]==a){ return a; } totalSet[a]=find_set(totalSet[a]); return totalSet[a];}void add_set(int a,int b){//把a分支并入b a=find_set(a),b=find_set(b); totalSet[a]=totalSet[b];}int main(){ ...
图论基础
图的储存储存图有很多种方式,在此介绍难度循序渐进的三种:邻接数组,邻接表,链式前向星。第一种虽然简单,但访问的时间和空间花销过大,第三种最为优越,但使用较难,因此第二种最为常见。让我们分别看看它们是什么 在介绍之前,我们先解释一下此处说的“图”是什么。 在算法领域,图一般指多个节点之间相互连接的关系。这就是一个简单的图: 从上图可以看出,节点之间的联系可以是有向的,也可以是无向的,把图分为有向图和无向图。节点之间的“边”可以是有长度的,也可以是无长度的,这里的长度一般被称为“权值”,把图分为有权图和无权图。注意,权值并不一定是边的长度,也可以是和边有关的值,需要具体问题具体分析。 现在,我们来介绍一下如何储存这种点和边的关系。 邻接数组这是最为简单的方法,使用一个二维数组去储存点和边的关系。我们只考虑最复杂的有权有向图,至于其他类型,可以从有权有向图简化得到。如无权有向图就是把权值改为1即可。 现在用邻接数组储存...









