中所周知,C++ 中的 struct 来源于 C 语言历史遗留,除了默认作用域为 public 外,与 class 并无区别,理论上可以混用。我们这里通过标准库,以及 Unreal 等工程实践,对 struct 和 class 关键字的选择进行一个总结。 如果类型包含非 public 成员变量,应当选择 class 。 如果类型包含 virtual 函数,应当选择 class 。 如果类型可以 聚合初始化 ,应当考虑 struct 。 如果类型的构造析构以及赋值函数为 = default; 实现

Read More

本文完全由 ChatGPT 生成。 std::function 和 std::any 采用构造新对象并交换的实现方式,也有一些其他的优点和好处。例如,这种实现方式可以避免赋值运算符(operator=)抛出异常的情况,从而保证了赋值操作的异常安全性。 例如,如果 std::function 和 std::any 采用直接调用赋值操作的方式实现赋值,那么在赋值操作中如果抛出了异常,就可能导致对象的状态发生改变,从而导致程序的不正常终止。而采用构造新对象并交换的实现方式,可以避免赋值操作中抛出异常的

Read More

首先,在 cppreference 上对于这部分的描述节选为。 声明于块作用域且带有 static 或 thread_local 说明符的变量拥有静态或线程存储期,但在控制首次经过其声明时才会被初始化。在其后所有的调用中,声明均被跳过。 如果初始化抛出异常,则不认为变量被初始化,且控制下次经过该声明时将再次尝试初始化。 如果初始化递归地进入正在初始化的变量的块,则行为未定义。 函数内部的静态局部变量的初始化是在函数第一次调用时执行,在之后的调用中不会对其初始化。 在多线程环境下,仍能够保证静态局

Read More

函数签名 参考文档:new – delete 即使不包含 标准库 头文件,版本 可替换分配函数 与 可替换解分配函数 也会在每个翻译单元隐式声明。版本 可替换分配函数 与 可替换解分配函数 可以替换:在程序任意位置定义并在任意源文件的用户提供的拥有相同签名的非成员函数都会替换默认版本。它的声明不需要可见。 这意味着我们在替换全局 new/delete 函数时,无需在 .h 中声明,只需要在 .cpp 中定义他们。 对于某个可以替换的函数,如果程序中提供了它的多个替换,或它有带 inl

Read More

加锁的原则 规则10.1 多线程 进程并行访问共享资源时 一定要加锁保护 共享资源包括全局变量,静态变量,共享内存,文件等。 建议封装像智能指针一样的对象对锁进行管理,比如我们就封装了一个 auto_lock ,在构造时申请锁,析构中释放锁,保证不会忘记解锁。 规则10.2 锁的职责单一 每个锁只锁一个唯一共享资源,这样,才能保证锁应用的单一,也能更好的确保加锁的范围尽 量小。对于共享全局资源,应该根据实际需要,每类或每个资源,有一把锁。这样,这把锁只锁对这个资源访问的代码,通常这样的代码都会是

Read More

一键跳转至题目 题目描述 机器上有 $n$ 个需要处理的任务,它们构成了一个序列。这些任务被标号为 $1$ 到 $n$,因此序列的排列为 $1 , 2 , 3 \cdots n$。这 $n$ 个任务被分成若干批,每批包含相邻的若干任务。从时刻 $0$ 开始,这些任务被分批加工,第 ii 个任务单独完成所需的时间是 $T_i$ 。在每批任务开始前,机器需要启动时间 $s$,而完成这批任务所需的时间是各个任务需要时间的总和。 注意,同一批任务将在同一时刻完成。 每个任务的费用是它的完成时刻乘以一个费

Read More

洛谷P4781 题解公式 inline int FastPow(int x, int y) { if (y == 1) return x; if (!y) return 1; int tmp = FastPow(x, y >> 1) % mod; return tmp * tmp % mod * (y & 1 ? x : 1) % mod; } inline void Lagrange() { go(i, 1, n, 1) { up = down = 1; go(j, 1,

Read More

使用 Tarjan 算法 lli fa[maxn]; lli dfn[maxn]; lli low[maxn]; bool cut[maxn]; void tarjan(lli u) { dfn[u] = ++cnt; low[u] = dfn[u]; lli child = 0; for (lli i = 0; i < mp[u].size(); ++i) { lli v = mp[u][i]; if (!dfn[v]) { ++child; fa[v] = u; tarjan(v);

Read More

约定存边方式为从左部到右部的有向边,左右部点编号相同 匈牙利算法 lli mch[maxn]; lli vis[maxn]; bool dfs_hun(lli u, lli dfn) { if (vis[u] == dfn) return false; vis[u] = dfn; for (lli i = head[u]; ~i; i = edge[i].nxt) { lli v = edge[i].v; if (mch[v] == 0 || dfs_hun(mch[v], dfn)) { mc

Read More

lli n; lli arr[maxn]; lli lg[maxn]; lli st[maxn][32]; inline lli flg(lli x) { if (lg[x]) return lg[x]; lli tmp = x; lli res = 0; while (tmp) tmp >>= 1, ++res; return lg[x] = res – 1; } inline void init_st() { for (lli i = 1; i <= n; ++i) st[

Read More

题目传送门 性质 删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心;2.树中所有节点到重心的距离之和最小,如果有两个重心,那么他们距离之和相等; 两个树通过一条边合并,新的重心在原树两个重心的路径上; 树删除或添加一个叶子节点,重心最多只移动一条边; 一棵树最多有两个重心,且相邻。 思路 如果找到只有一个重心,那么直接删一个重心的直连边然后加回去就好了。 如果找到两个重心,那么在其中一个重心上找到一个直连点不是另一个重心,删除连另外一个就好了。 如何求树的重心? 先任选一

Read More

原题链接 https://codeforces.com/contest/1406/problem/D 思路 样例中a=2,-1,7,3; 差分为-3,8,-4; 设(b[1]=x)+(c[1]=y)=a[1]; ∵b[1]=c[2]>=…>=c[n] x+(y-3)=(x-1)+(y-2)=(x+1)+(y-4)=…=a[2] ∴b[2]=x c[2]=y-3为最优解 其他的解都会导致b[n]或者c[1]变大 使最后答案不是最小 即:差分>0时,将差分的

Read More

题解 [该代码需要配合线段树] int cnt; int fa[maxn]; int dep[maxn]; int siz[maxn]; int son[maxn]; int rk[maxn]; int top[maxn]; int id[maxn]; inline void init_tree() { cnt = 0; } void dfs_ss(int u) { int ms = -1; int mss = 0; siz[u] = 1; for (int i = head[u]; ~i; i

Read More

条款 01:视 C++ 为一个语言联邦 C++分为:C部分、对象C++部分、模板C++部分、STL部分。 条款 02:尽量以 const、enum、inline 替换 #define const: 表示修饰的内容不可更改。 enum: 本质是 int 类型。 inline: 在 class 内时,如果函数允许,他被自动启用。 条款 03:尽可能使用 const 这有利于编译器更好的优化程序,并且让客户减少误操作。 在函数传值时,对于自定义类型,最好使用 const 引用。 用 mutable 修

Read More

dfs(数的最后若干位,各种限制条件,当前第几位) if 最后一位 return 各种限制条件下的返回值 局部变量 ct=当前位的数字 局部变量 sum=0; for i=0 to ct-1 sum+=当前位取i时一定无无限制的合法状态数 sum+=当前位取i时满足当前限制的合法状态数 根据ct更新限制条件 不再满足则return sum return sum+dfs(当前位后的若干位,更新后的限制条件,下一位) slv(当前数) if(只有一位) return 对应的贡献 局部变量 ct; f

Read More

准备 下载源码 下载地址:http://www.wxwidgets.org/downloads/ 选择 Source Code > Windows 7z 下载 解压源码 解压 wxWidgets 编译源码 用 V S打开 wxWidgets-X.X.X\build\msw\wx_vc15.sln 分别选择Debug、DLL Debug、DLL Release、Release 然后点击 生成 > 生成解决方案 等待编译完成即可 样例 准备 新建一个空项目,建立 Main.cpp,复制官

Read More

源文件头部注释 列出:版权、作者、编写日期和描述。 每行不要超过80个字符的宽度。 示例: /************************************************* Copyright:Call_Me_Why Author:why Date:2010-08-25 Description:Something about C++ **************************************************/ 函数头部注释 列出:函数的目的/功能、输

Read More