C++应用
文章平均质量分 70
数据结构与软件工程相关的C++程序设计。
qq_26697045
这个作者很懒,什么都没留下…
展开
-
顺序容器
欢迎访问我的博客。原创 2023-11-16 21:57:18 · 124 阅读 · 0 评论 -
智能指针
欢迎访问我的博客。原创 2023-11-16 00:00:10 · 144 阅读 · 0 评论 -
混合背包三类问题
背包1. 简单背包 背包问题不考虑空隙,只要物体体积之和不大于背包容量,就能放进去。1. 简单背包 问题:背包容量 cap 已知,n 个各不相同的物体的体积 caps 已知,求有多少种方法正好把背包放满。int dp[50][50];template<int N>int simple_package(const int cap, const int(&caps)[N]) { dp[0][0] = 1; for (int i = 1; i <= cap; i++原创 2021-07-08 16:58:25 · 679 阅读 · 0 评论 -
性能优化
性能优化1. 巧用计算方法1. 巧用计算方法 x 对 2 的 n 次方取余等价于 x 与 2 的 n 次方减去 1 位与:x%2n=x&(2n−1)x \% 2^n = x \& (2^n-1)x%2n=x&(2n−1)。特别常用的对 2 取余的计算:x%2=x&1x \% 2 = x \& 1x%2=x&1。 x 除以 2 的 n 次方等价于 x 右移 n 位:x÷2n=x>>nx \div 2^n =x >> nx÷2n原创 2021-07-05 22:18:36 · 71 阅读 · 0 评论 -
数学相关算法
数学算法1. 整数划分2. 快速求幂1. 整数划分【参考】2. 快速求幂原创 2021-06-29 17:01:38 · 385 阅读 · 0 评论 -
结构型模式
结构型模式1. 迭代器2.观察者3.模板(Template)1. 迭代器2.观察者3.模板(Template)#include<iostream> using namespace std;// 1class Game { public: void play() { initialize(); startPlay(); endPlay(); } private: virtual void initialize() = 0; virtual voi原创 2021-06-28 20:35:53 · 88 阅读 · 0 评论 -
并发程序设计
并发程序设计1. 线程同步算法题1. 线程同步算法题 以力扣多线程题库为例说明线程同步方法。题1114:按序打印。测序程序:void print1() { cout << "first"; }void print2() { cout << "second"; }void print3() { cout << "third"; }int main() { Foo fo; thread th1(&Foo::first, &fo, pri原创 2021-06-28 20:24:27 · 148 阅读 · 0 评论 -
线程同步
线程同步与通信1. 线程同步2. 线程通信1. 线程同步 临界区、互斥对象用于互斥控制。信号量、事件对象用于同步控制。2. 线程通信原创 2021-06-28 20:22:16 · 211 阅读 · 0 评论 -
有锁编程
有锁编程1. 互斥锁1.1 互斥锁1.2 lock_guard1.3 unique_lock2. 条件变量3. 自旋锁 一个线程对临界区加锁后,在它解锁前,其它线程不能对该临界区加锁,也不能访问该临界区。 互斥锁:加锁失败的线程被阻塞。锁被释放时线程被唤醒。 自旋锁:加锁失败不会放弃CPU,直到获得锁。 读写锁:写锁被获得时,所有申请读锁的线程都被阻塞。写锁没有被获得时,多个线程可以同时获得读锁。1. 互斥锁 互斥锁 mutex 可以实现互斥。互斥锁包装类 lock_guard 是对原创 2021-06-28 20:17:42 · 160 阅读 · 0 评论 -
无锁编程
无锁编程1. 原子类型的使用1.1 基本原子类型1.2 复合原子类型2. 原子类型的探究 C++ 11 使用 atomic 原子操作实现无锁编程。修改原子类型的操作是原子操作,原子操作不会被线程调度机制打断,可以保证数据一致性。1. 原子类型的使用1.1 基本原子类型例 1:atomic<int> num(0);void add() { for (int i = 0; i < 100000; i++) // 加10万次。 num++;}int main() {原创 2021-06-28 20:01:11 · 188 阅读 · 0 评论 -
子串和子序列
算法题1. 最大子串和1. 最大子串和 输入整数序列,输出所有连续子串中和最大的那个子串的和。 示例输入:[1,2,3,−4,5,−6][1, 2, 3, -4, 5, -6][1,2,3,−4,5,−6],输出777。// 1.暴力法:遍历所有子串。template<size_t N>int maxSubStr1(int (&arr)[N]) { int Max = INT_MIN; for (int i = 0; i < N; i++) { int SU原创 2021-06-22 12:56:22 · 1233 阅读 · 0 评论 -
创建线程
C++多线程1. 线程和进程1.1 线程2. 力扣线程题库1. 线程和进程 进程是资源分配的最小单位。进程有单独地址空间,一个进程崩溃可以不影响其它进程。 线程是运行调度的最小单位。线程共享地址空间,一个线程崩溃整个进程会结束。线程基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)。1.1 线程void fun() { while (true) { cout << "--thread id: "<< GetCurrentThre原创 2021-05-04 13:35:32 · 340 阅读 · 0 评论 -
创建型模式
C++:设计模式Ⅰ. 创建型模式1. 工厂模式(Factory Pattern)Ⅱ. 结构型模式Ⅲ. 行为型模式Ⅳ. 代码部分Ⅰ. 创建型模式1. 工厂模式(Factory Pattern)例程。意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。优点:一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品...原创 2019-10-31 22:37:55 · 196 阅读 · 0 评论 -
内 部 排 序
欢迎访问我的博客。原创 2021-05-27 11:26:41 · 248 阅读 · 0 评论 -
查找
树1. 二叉树2. 红黑树1. 二叉树二叉树的创建与删除。typedef struct node { // 二叉树结点。 node(int d) :data(d), lchild(nullptr), rchild(nullptr) {} int data; struct node* lchild, * rchild;}BTNode;BTNode* buildTree() { // 创建二叉树。 BTNode* ns[10]; for (int i = 0; i < 10;原创 2021-05-21 22:26:15 · 292 阅读 · 0 评论