摘要: 1.平衡二叉树 1.1概述 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉搜索树,它的每个节点的左右子树的高度差的绝对值不超过 1,并且左右子树也都是平衡二叉树。这意味着所有的平衡二叉树都必然是二叉搜索树,但并非所有的二叉搜索树都是平衡二叉树。平衡二叉树的主要目的是避免二叉搜 阅读全文
posted @ 2026-01-06 14:49 r5ett 阅读(25) 评论(0) 推荐(0)
摘要: 1.二叉搜索树概述 二叉搜索树(Binary Search Tree, BST)也叫二叉排序树(Binary Sort Tree),是一种特殊的二叉树,它满足以下性质: 左子树:左子树上所有节点的值都小于根节点的值。 右子树:右子树上所有节点的值都大于根节点的值。 递归性质:左子树和右子树本身也是二 阅读全文
posted @ 2026-01-06 14:49 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 1.二叉树 二叉树是一种树形数据结构,其中每个节点最多有两个子节点(0,1,2),分别称为‌左子节点和‌右子节点。二叉树由一个根节点和两棵互不相交的子树组成,这两棵子树分别称为根的左子树和右子树。二叉树的定义可以递归地描述:二叉树是一个有限的节点集合,这个集合可以是空集(即没有节点),或者由一个根节 阅读全文
posted @ 2026-01-06 14:49 r5ett 阅读(15) 评论(0) 推荐(0)
摘要: 主要根据https://subingwen.cn/data-structure/ 进行学习 1.树的定义 1.1定义 树(Tree)是n(n>=0)个节点的有限集。当n=0时称为空树。 对于上面这棵树而言,A是它的根节点,左侧橙色部分和右侧黄色部分分别是这棵树的两个子树,而分别在以B、C为根节点的子 阅读全文
posted @ 2026-01-06 14:49 r5ett 阅读(6) 评论(0) 推荐(0)
摘要: 通过对象调用函数,对象的地址就是this 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 对象模型 只要符合1.通过指针 2.向上 3.调用虚函数 这三个条件,编译器就会把调用动作编译成((p->vptr)[n])(p)或( p->vptr[n] )(p) 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 1.数量不定的模板参数 2.auto 3.range-base for 4.reference 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(5) 评论(0) 推荐(0)
摘要: 1.类模板 2.函数模板 3.成员模板 4.模板特化 泛化: 它对任意类型 Key 都有效,但里面什么都没实现 意思是:“对于任何我不知道怎么算哈希值的类型,我先提供一个空框架。” 这叫泛化版本(generalization),因为它适用于“所有可能的 Key”,是最广义的、默认的版本。 如果你用一 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 1.function-like classes,所谓仿函数 一个对象能够像函数一样被调用,关键就是重载(重定义)operator()。 比如: template struct identity { const T& operator()(const T& x) const { return x; } 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 1.pointer-like classes,关于智能指针 类型名 对象名(参数列表); 如 int x(5); // 调用 int 的构造函数(其实就是初始化),x = 5 string s("hello"); // 调用 string 的构造函数,s 被初始化为 "hello" complex 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 1.构造函数 比如分数可以被视为一个double 没参数,不用写返回类型(直接用名称了),通常加const 2.non-explicit-one-argument ctor非显式的、只有一个参数的构造函数 3.conversion function vs. non-explicit-one-argu 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(4) 评论(0) 推荐(0)
摘要: 1.例子1 2.例子2 Prototype Pattern原型,核心思想是: 用一个已经创建好的对象(原型)作为模板,通过拷贝(clone)它来创建新对象,而不是每次都用 new + 构造函数参数去创建。 最上面的 Prototype 类:Image(抽象基类) class Image { publ 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 1.inheritance with virtual functions(虚函数) non-virtual函数:你不希望derived class(子类)重新定义它 virtual函数:你希望derived class重新定义它,且你对它已有默认定义 pure virtual函数:你希望derive 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(6) 评论(0) 推荐(0)
摘要: 1composition复合,表示has-a 内存上看 composition复合关系下的构造和析构 构造由内而外,container的构造函数首先调用component的default构造函数,然后才执行自己 container::container():component();//其中compo 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 1.静态函数不能调用this 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 1.stack objects的生命期 栈只要离开作用域就消失了,自动调用析构函数 2.static local objects的生命期 {static complex c2(1,2);} c2的生命在作用域结束之后仍然存在,直到整个程序结束 3.heap objects的生命期 堆要手动删除 4. 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(4) 评论(0) 推荐(0)
摘要: 拷贝构造 拷贝复制 析构函数是由编译器在对象生命周期结束时自动调用的,用来释放内存 class String { public: String(const char* cstr = 0);/* 构造函数 初始值为空 / String(const String& str);/ 拷贝构造函数 / Str 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 1.操作符重载1,成员函数,有this 2.操作符重载2,非成员函数,无this /* 重载复数的算术运算符和关系运算符 / / 下面这些函数绝不可return by reference 因为他们返回的必定是个local object */ inline complex operator + (co 阅读全文
posted @ 2026-01-06 14:48 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 1.构造函数被放在private区,在不允许外界创建对象时这么做。确保整个程序中,类A永远只有一个对象存在。 class A { public: static A& getInstance();//获取唯一实例的静态函数 setup() { ... }// 第2行:普通的成员函数(这里省略了实现) 阅读全文
posted @ 2026-01-06 14:47 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 1.构造函数的写法 1.1基本语法 class 类名 { public: 类名(参数列表) // 构造函数声明 { // 构造函数体:初始化代码 } }; 1.2 class 类名 { public: 类名(参数列表) : 成员1(参数1), 成员2(参数2), ... { // 构造函数体(通常为 阅读全文
posted @ 2026-01-06 14:47 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 1.创建头文件的时候加入防御式声明 ifndef A define A endif 2.非模板,这里需要前置声明 ifndef COMPLEX define COMPLEX include /* 前置声明 */ class ostream; class complex; complex& __doa 阅读全文
posted @ 2026-01-06 14:47 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 如果要链接动态库,那就要有一个目标 如果要链接静态库,链接的动作要写在上面 target_link_libraries可以链接动态库也可以链接静态库 即下面这个顺序 指定链接CALC动态库的地址 link_directories(${LIBATH}) 原文件变成静态库 add_library(${S 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 静态库链接静态库时,比如sort中的insert代码中用了add函数 通过link_libraries()把要链接的库制定出来,如果静态库是自定义的,还需要link_directories()指定静态库对应的路径 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 1.添加子目录 add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) source_dir:指定了CMakeLists.txt源文件和代码文件的位置,其实就是指定子目录 binary_dir:指定了输出文件的路径,一般不需要指定,忽 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 在进行程序测试的时候,我们可以在代码中添加一些宏定义,通过这些宏来控制这些代码是否生效 add_definitions(-D宏名称) test.cpp: include <stdio.h> define NUMBER 3 int main() { int a = 10; ifdef DEBUG pr 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 1.获取 list 的长度。 list(LENGTH ) LENGTH:子命令LENGTH用于读取列表长度 :当前操作的列表 :新创建的变量,用于存储列表的长度。 2.读取列表中指定索引的的元素,可以指定多个索引 list(GET [ ...] ) :当前操作的列表 :列表元素的索引 从0开始编号, 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(0) 评论(0) 推荐(0)
摘要: 1.追加 1.1set set(变量名1 ${变量名1} ${变量名2} ...) cmake_minimum_required(VERSION 3.10.2) project(test) aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC) #PR 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 在CMake中可以用用户显示一条消息,该命令的名字为message: message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...) (无) :重要消息 STATUS :非重要消息 WA 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 在cmake中链接动态库的命令如下: target_link_libraries( #谁要链接动态库 <PRIVATE|PUBLIC|INTERFACE> ... [<PRIVATE|PUBLIC|INTERFACE> ...]...) target:指定要加载的库的文件的名字 该文件可能是一个源文 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(0) 评论(0) 推荐(0)
摘要: 在cmake中,链接静态库的命令如下: link_libraries( [...]) 如果该静态库不是系统提供的(自己制作或者使用第三方提供的静态库)可能出现静态库找不到的情况,此时可以将静态库的路径也指定出来: link_directories() 将静态库放入lib1文件中,动态库放入lib2文 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(0) 评论(0) 推荐(0)
摘要: 有时候编译项目并不是为了得到可执行程序,而是要把当前项目的原文件编译成库文件,动态库或静态库提供给第三方使用 动态库有可执行权限,静态库没有 windows动态库.dll 静态库.so Linux动态库.lib 静态库.a 1.制作静态库 add_library(库名称 STATIC 源文件1 [源 阅读全文
posted @ 2026-01-06 14:46 r5ett 阅读(2) 评论(0) 推荐(0)
摘要: 将.h都放在include文件夹,.cpp都放在src文件夹 include_directories(${PROJECT_SOURCE_DIR}/include) #添加头文件路径 阅读全文
posted @ 2026-01-06 14:45 r5ett 阅读(4) 评论(0) 推荐(0)
摘要: 1.方式1 aux_source_directory查找某个路径下的所有源文件 aux_source_directory(< dir > < variable >) dir:要搜索的目录 variable:将从dir目录下搜索到的源文件列表存储到该变量中 cmake_minimum_required 阅读全文
posted @ 2026-01-06 14:45 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 给变量初始化的一个命令是set 通过set命令设置变量值的时候,这个变量的值都是字符串类型 1.定义变量 [] 中的参数为可选项, 如不需要可以不写 SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) VAR:变量名 VALUE:变量值 取值${变量名} 阅读全文
posted @ 2026-01-06 14:45 r5ett 阅读(4) 评论(0) 推荐(0)
摘要: 1.源代码 1.1.add.cpp include <stdio.h> include "head.h" const char* libVersion = "Library Version 1.0"; int add(int a, int b) { return a+b; } 1.2.div.cpp 阅读全文
posted @ 2026-01-06 14:45 r5ett 阅读(1) 评论(0) 推荐(0)
摘要: 主要通过学习https://www.bilibili.com/video/BV14s4y1g7Zj?spm_id_from=333.788.videopod.sections&vd_source=7868e96ae7c6a5668afdaed7cbc8ac32 https://subingwen.c 阅读全文
posted @ 2026-01-06 14:44 r5ett 阅读(3) 评论(0) 推荐(0)
摘要: 主要根据这个教程学习https://subingwen.cn/linux/makefile/ 1.规则 每条规则由三个部分组成分别是目标(target), 依赖(depend)和命令(command)。 # 每条规则的语法格式: target1,target2...: depend1, depend 阅读全文
posted @ 2026-01-06 14:43 r5ett 阅读(2) 评论(0) 推荐(0)