自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 资源 (4)
  • 收藏
  • 关注

原创 二叉查找树、二叉搜索树、二叉排序树算法分析及实现

二叉查找树(Binary Search Tree,简称 BST),又称为二叉搜索树、有序二叉树(Ordered Binary Tree)。二叉查找树或是空二叉树,或是满足以下三个性质的二叉树。若其左子树非空,则左子树上所有节点的值都小于根节点的值若其右子树非空,则右子树上所有节点的值都大于根节点的值其左右子树也分别是一棵二叉查找树

2024-04-12 21:41:01 809

原创 图解二叉树遍历方法-前序遍历、中序遍历、后序遍历

前序遍历二叉树(Pre-order Traversal)的规则为:从根结点出发,先访问该结点,然后前序遍历该结点的左子树,再然后前序遍历该结点的右子树。中序遍历二叉树(In-order Traversal)的规则为:从根结点出发,先中序遍历该结点的左子树,然后访问该结点,再然后中序遍历该结点的右子树。后序遍历二叉树(Post-order Traversal)的规则为:从根结点出发,先后序遍历该结点的左子树,然后后序遍历该结点的右子树,再然后访问该结点。

2024-04-11 01:39:56 879

原创 扩展二叉树前序遍历序列构建二叉树(图解)

是 n(n >= 0)个结点(每个结点最多只有2棵子树)的有限集合,该集合可为空集(称为空二叉树),或由一个根节点和两颗互不相交的,称为根节点的左子树和右子树的二叉树组成。:将二叉树中的每个结点的空子结点用一个虚拟结点表示,其值为一特定的值,比如"#",这样每个结点都有两个子结点,这种处理后的二叉树为原二叉树的扩展树。扩展二叉树就可以做到一个遍历序列确定一颗二叉树。例如:图1为一颗二叉树,图2为这颗二叉树的扩展二叉树:先访问根结点,然后遍历左子树,最后遍历右子树。

2024-04-09 11:39:38 1156 2

原创 C语言union联合体(共用体)

union联合体(共用体)是一种特殊的自定义的数据类型,它包含一系列的成员变量,这些成员变量共用一块内存空间。

2023-12-13 22:22:32 1099

原创 子类出现和父类同名的成员,子类如何访问父类的同名成员?

子类访问父类同名的成员,需加父类作用域。因为:1.子类中出现和父类同名的成员变量,子类会屏蔽掉父类的同名成员变量。2.子类中出现和父类同名的成员函数,子类会屏蔽掉父类中跟子类同名的所有函数(包括重载的所有版本)。

2023-11-30 18:23:14 539

原创 子类拷贝构造函数会调用父类拷贝构造函数吗?

1.编译器提供的默认子类拷贝构造函数会调用父类拷贝构造函数。2.重写的子类拷贝构造函数默认不会调用父类的拷贝构造函数,而是调用父类默认构造函数。3.重写的子类拷贝构造函数时应当显式的告诉编译器去调用父类的拷贝构造函数去构造父类,从而避免调用子类拷贝构造函数去创建一个对象时,导致子类中包含父类的那部分数据丢失的情况发生。具体做法为:Child(const Child &other) : Parent(other);

2023-11-30 14:57:51 817

原创 常量指针和指针常量的区别

常量指针,本质是指针,这个指针指向的内存块是常量,不能通过这个指针改变指向的内存块的值。

2023-11-27 19:36:58 617

原创 linux文件I/O之 fcntl() 函数用法:设置文件的 flags、设置文件锁(记录锁)

利用 fcntl() 函数获取、设置文件的 flags 和 设置文件锁是在现实开发中比较常用到的功能,比如将一个 socket 设置为非阻塞(O_NONBLOCK)。有时有两个进程对同一个文件进行读写操作时,该文件的最后状态取决于写该文件的最后一个进程。当一个进程正在读写文件的某一区域时,用 fcntl() 函数用 F_SETLK 命令请求对该文件加锁,其他进程就不能对文件的这个区域进行修改操作。

2023-08-12 20:08:33 806

原创 linux文件I/O之 close()、lseek()、read()、write() 函数用法

int close(int fd); // 关闭一个文件描述符 off_t lseek(int fd, off_t offset, int whence); // 设置文件偏移量 ssize_t read(int fd, void *buf, size_t count); //从fd中读取count字节到buf ssize_t write(int fd, const void *buf, size_t count); // 将buf中的count字节写入到fd引用的文件中

2023-08-10 21:15:15 808

原创 linux文件I/O之 open() 函数用法

linux open() 函数用于打开或创建一个文件,函数原型为:int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); 其中:pathname:路径名。flags:位掩码,用于指定文件的打开模式。mode:位掩码,用于当调用 open() 函数创建新文件时,指定文件的访问权限。

2023-08-09 15:51:48 592

原创 linux umask:文件访问权限控制预设值

在 linux 系统中,umask 被定义在 /etc/profile 配置文件中,有一段 shell 脚本对 umask 是这么定义的。在 shell 会话输入命令:$ cat /etc/profile # 查看 /etc/profile 配置文件的内容。

2023-08-09 02:32:51 482

原创 UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

操作系统可被定义为一种软件,它控制计算机硬件资源,提供程序运行的环境。我们通常将这种软件称为内核(kernel),因为它相对较小,而且位于环境的核心。内核的接口被称为系统调用(system call),公用函数库构建在系统调用接口之上,应用程序可以使用公用函数库提供的接口,也可以使用内核提供的接口(系统调用)。shell 是一个特殊的应用程序,为运行其他应用程序提供了一个接口。

2023-08-07 23:44:52 1532

原创 __attribute__((noreturn)) 修饰函数,告诉编译器这个函数没有返回值

GNU C 的一大特色就是__attribute__ 机制,__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。:这个属性告诉编译器函数永远不会有返回值,可以避免当一个函数需要返回值,在某种条件下未能执行到返回值处编译器警告或报错。当__attribute__ 用于修饰函数时,它就相当于一个函数说明符,跟 inline 等同一类。attribute.c 文件(exit_my 函数。

2023-08-05 19:34:57 412

原创 linux 安装 lua5.4.4

【代码】linux 安装 lua5.4.4。

2023-06-01 09:34:33 281

原创 C++vector容器用法详解

vector 是封装动态数组的顺序容器,连续存储数据,所以我们不仅可以通过迭代器访问存储在 vector 容器中的数据,还能用指向 vector 容器中的数据的常规指针访问数据。这意味着指向 vector 容器中的数据的指针能传递给任何期待指向数组元素的指针的函数。

2023-04-01 13:23:36 3088 1

原创 C++简单工厂模式(模板类实现)

简单工厂模式(Simple Factory Mode),又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

2023-03-28 21:45:43 716 1

原创 centos 7安装mysql

今天在centos 7上安装mysql数据库,遇到了些问题以及解决方法,记录一下。

2023-03-27 23:56:53 687

原创 C++stoul、stoull 函数用法

stoul 函数:将字符串转成 unsigned long 整数。stoull 函数:将字符串转成 unsigned long long 整数。使用时需要注意的是 stoul、stoull 函数是C++11标准加入的,用g++编译器编译时需要加参数:-std=c++11

2023-03-24 01:31:21 4254

原创 C++bool,char,int,long,float,double取值范围以及存储形式

C++基本数据类型包括bool、char、int、long、float、double、long double等。数据在计算机内存中是以补码的形式存储的。机器数就是数据在计算机中的二进制表示形式。机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。原码就是机器数,即用最高位存放符号, 正数为0, 负数为1。, 其余位表示值。正数的反码就是它的原码,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。正数的补码就是它的原码,负数的补码是它的反码加1。

2023-03-23 21:00:57 1052

原创 C++模板

C++模板分为函数模板和类模板。函数模板代表了一个函数家族,该函数模板与数据类型无关,当使用到函数模板时,会去调用特定版本的模板函数。类模板代表了一个类家族,该类模板与数据类型无关。程序在编译阶段,编译器会根据指定的模板数据类型生成特定版本的模板类,程序在运行的过程中,使用到类模板的地方,就会去调用特定版本的模板类中相对应的函数。使用C++模板可编写与数据类型无关的通用代码,提高代码复用率,可维护性。C++标准模板库(STL)主要就是运用了C++模板技术来实现。

2023-03-23 13:36:33 609

原创 C++stoi、stol、stoll 函数用法

stoi 函数:将字符串转成 int 整数。stol 函数:将字符串转成 long 整数。stoll 函数:将字符串转成 long long 整数。使用时需要注意的是 stoi、stol、stoll 函数是 C++11 标准加入的,用 g++ 编译器编译时需要加参数:-std=c++11

2023-03-22 14:12:21 13189

原创 C++string类函数用法详解

C++string类常用函数(参考标准库整理)string(const char *s); //创建一个string对象,并初始化字符串为指针 s 指向的字符串string(const char *s, int n); //创建一个string对象,并初始化字符串为指针 s 指向的前 n 个字符string(const string &str); //创建一个 string 对象,并初始化字符串为 str

2023-03-21 23:56:39 1066

原创 C++多态

在计算机的编程语言中,多态指的是为不同数据类型的实体提供统一的接口。C++多态:父类的成员函数声明为虚函数或纯虚函数,子类重写父类的虚函数或纯虚函数,在使用时,让子类的对象指向父类的引用或指针,从而实现运行时多态。动态多态函数地址是晚绑定,运行阶段确定函数地址。含有纯虚函数的类称为抽象类。在C++中使用多态时,如果在堆区new子类对象指向父类指针,那么父类指针在释放时,是调用不到子类的析构函数的,为了解决这个问题,需要把父类的析构函数定义为虚析构函数或纯虚析构函数。

2023-03-18 23:07:35 245

原创 C++程序在内存中的模型

C++程序在内存中的模型:从地地址到高地址为,用户空间:受保护区,代码区(.text段),只读数据段(.rodata段),数据段(.data段),未初始化数据段(.bss段),堆区(heap),共享库,栈区(stack),内核空间:不允许用户层直接访问的。Linux 64位系统,理论上,64bit内存地址可用空间为:0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF。Linux 64位操作系统仅使用了低地址的47位,高地址的17位。

2023-03-17 14:28:46 832

原创 linux 64位操作系统环境下用gcc、g++编译32位程序

在linux 64位操作系统环境下,默认编译生成的可执行文件是64位的。今天由于测试验证需要,需要将程序编译成32位的可执行文件,碰到了一些问题,下面做一下记录。我们有一个test.c,有一个test.cpp,功能都是打印:Hello World。

2023-03-15 15:06:16 4269 2

原创 C++面向对象编程之八:继承

在C++中,把事物共有属性或方法放在父类,把事物特有的属性或方法放在子类,子类继承父类的属性或方法,从而达到少写重复的代码,提高代码的简洁性,可读性等,这样的编程思想,就叫做继承。继承语法:class 子类名:继承方式 父类名,这个被其它类继承的类叫父类(或基类)。继承了其他类的类叫做子类(派生类)。子类继承于父类,子类会把父类所有的非静态成员变量都继承(包括父类的private非静态成员变量)过来,只是父类的private非静态成员变量编译器做了限制,子类不可以访问。

2023-03-14 01:49:25 171

原创 C++面向对象编程之七:重载操作符(++,--,[],->,())

重载操作符为全局函数时,应该将全局函数设置为类的友元(friend)。必要时应该重载赋值操作符=,避免两个对象内部的指针指向同一片内存空间,导致出现悬垂指针的问题。重载操作符操作符的本质是重载函数,例如:重载操作符为类的成员函数时,本质是调用了该类的成员函数。例如:MyInt c = a + b; //本质是:MyInt c = a.operator+(b);不能的重载的操作符有:.、::、.*、->*、?=、sizeof、#。必须重载为类的成员函数的操作符有:=、[]、->、()

2023-03-13 16:55:59 231

原创 C++面向对象编程之六:重载操作符(<<,>>,+,+=,==,!=,=)

C++允许我们重新定义操作符(例如:+,-,*,/)等,使其对于我们自定义的类类型对象,也能像内置数据类型(例如:int,float,double)等一样直观,可以进行加,减,乘,除,比较大小等等操作。重载操作符本质是函数,只是这个函数的函数名比较特别,为:operator后接需要重新定义的操作符的符号。例如,重载+号,函数名为:operator+;重载-号,函数名:operator-。因为重载操作符本质是函数,所以实际上就是为某个自定义的数据类类型或枚举类型实现函数重载。

2023-03-10 21:55:03 4821

原创 C++面向对象编程之五:友元(friend)

C++中,允许一个类的非共有成员被这个类授予友元关系的全局函数,另一个类,或另一个类中的成员函数访问。友元不是一个类中的成员,所以它们不受声明出现部分的访问权限(public,protected,private)影响。友元函数是在类中用关键字friend修饰的非成员函数。友元函数可以是一个普通的函数,也可以是其他类的成员函数。虽然它不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。友元类是在类中用关键字friend修饰的另一个类的声明。

2023-03-09 20:54:44 651

原创 C++面向对象编程之四:成员变量和成员函数分开存储、this指针、const修饰成员和对象

在C++中,成员变量和成员函数是分开存储的,只有非静态成员变量才存储在类中或类的对象上。通过该类创建的所有对象都共享同一个函数。在C++中,空类占用内存大小为一个字节。this指针隐含在每一个非静态成员函数内,每一个非静态成员函数都隐含有一个this指针。当对象调用非静态成员函数时,this指针指向该对象。const成员函数(常函数)不能修改普通的成员属性,但常量成员函数(常函数)可以对有mutable修饰的成员属性进行修改。const修饰的对象叫常对象,常对象只能调用常函数。

2023-03-09 14:36:05 633 2

原创 C++面向对象编程之三:初始化列表、类对象作为类成员、静态成员

C++提供了初始化列表语法,可以用于成员属性初始化。C++中的另一个类的对象可以作为类的成员,我们称为该成员为对象成员。那么这时是先构造对象成员,后构造该类,析构函数刚好相反,先析构该类,后析构对象成员。静态成员变量:就是在成员变量前加上关键词static修饰的,static成员变量,所有对象共享一份数据,在编译阶段分配内存,类内声明,类外初始化,static成员变量也是有访问权限的。静态成员函数:就是在成员函数前加上关键字static修饰,静态成员函数的函数体内只能访问静态成员变量和静态成员函数

2023-03-08 20:25:46 503

原创 C++面向对象编程之二:构造函数、拷贝构造函数、析构函数

C++利用构造函数和析构函数,完成对象的初始化和清理工作。对象的初始化和清理工作,是编译器强制我们要做的事情,如果我们不提供构造函数和析构函数,编译器会提供3个函数:1. 默认无参构造函数。2. 默认拷贝构造函数。3. 默认析构函数。构造函数:在对象初始化时,对对象的成员属性赋初始值。构造函数由编译器自动调用,不用手动调用。拷贝构造函数:在对象初始化时,将一个已有的对象的所有成员属性拷贝到这个被创建的对象上。拷贝构造函数由编译器自动调用,不用手动调用。析构函数:在对象销毁前系统自动调用,执行一些清理工作

2023-03-08 14:04:28 987

原创 C++面向对象编程之一:封装

C++面向对象编程三大特性为:封装,继承,多态。C++认为万事万物皆为对象,对象有属性和行为。具有相同属性和行为的对象,我们可以抽象称为类。将具有相同属性和行为的对象,抽象为类,并对属性和行为加以权限控制,来表现事物,我们称为封装。在设计类的时候,可以把属性和行为放在不同的权限下,控制属性和行为的访问权限。访问权限有三种:public权限:类内可访问,类外也可访问,子类可访问;protected权限:类内可访问,类外不可访问,子类可访问;private权限:类内可访问,类外不可访问,子类不可访问。

2023-03-07 16:03:52 742

原创 C++引用

1.引用(reference)就是它绑定的对象的别名(另一个名字)。在实际的程序开发中,引用主要用作函数的形式参数。2.引用的定义:数据类型 &别名 = 原名; 3.引用作为函数的形参,实际上形参是实参的一个别名,所以引用传递,在函数体内对形参的修改,实际上是对实参的修改。

2023-03-04 22:11:10 417

原创 空指针,野指针

在C/C++中,空指针(null pointer)是指向内存地址0的指针变量。野指针(wild point)是指向的内存地址空间是未知的,不确定的指针。也就是这个指针存放的内存地址是不合法的,我们对其进行操作,可能会出现严重的后果。

2023-03-03 13:04:22 1461

原创 6.排序算法之三:插入排序

插入排序就像抽牌,有n张无序的牌,并把这n张牌分成有序区(刚开始有序区牌数为1,即列表下标为0的那张牌)和无序区(刚开始无序区牌数为n-1),并从无序区的第一张牌(即列表中下标为1的那张牌)开始抽牌,并从这张牌的位置开始向前查找(即将这张牌跟有序区的最后一张牌开始查找比较),并进行移动,直到找到合适的位置,进行插入操作。插入排序又叫直接插入排序,插入排序的时间复杂度为:O(n^2^),插入排序算法是稳定的。

2023-03-02 14:59:49 49

原创 5.排序算法之二:选择排序

选择排序(select sort)在无序列表中,把无序列表分成有序区(刚开始有序区元素个数为0)和无序区(刚开始无序区元素个数为n),循环n-1趟,每一趟找到最小或最大的那个元素,并把最小或最大的那个元素放在有序区,此时有序区元素个数加1,无序区元素个数减1,直到循环n-1趟后,列表都已排序好,此时,有序区的元素个数为n,无序区元素个数为0。选择排序算法的时间复杂度为:O(n^2^),选择排序算法是不稳定的排序算法

2023-03-01 19:26:58 349

原创 4.排序算法之一:冒泡排序

冒泡排序列表中每相邻的两个数进行比较,如果前面比后面大,则交换这两个数。一趟排序完成后,无序区减少了一个数,有序区增加了一个数。代码关键点:总趟数(n-1),每一趟无序区范围,每一趟下标最大值为(n-i-1)冒泡排序算法的时间复杂度为:O(n^2^)冒泡排序算法是稳定的排序算法

2023-03-01 15:56:16 376

原创 3.查找算法:顺序查找和二分查找

顺序查找的算法时间复杂度为:O(n),二分查找的算法时间复杂度为:logn。(1)如果需要查找时,并且被查找的列表有序,那么选择二分查找,执行效率会比顺序查找快很多。(2)如果需要查找时,被查找的列表无序,就选择顺序查找。但是,如果需要频繁查找时,我们可以选择先对被查找的列表进行排序,然后在选择二分查找,从而提高查找的效率。

2023-02-28 21:58:25 833

原创 2.递归算法

递归算法的两个特点(很重要)1. 调用自身2. 要有结束条件

2023-02-28 18:52:16 627

对象池模板

使用对象池,减少new和delete的次数,提供运行效率,减少内存碎片,统一管理内存,防止new和delete用得不当导致内存泄露,对应的博客链接:http://blog.csdn.net/d704791892/article/details/40486261

2014-10-27

VC发送自定义消息

VC/MFC发送自定义消息Demo,源码对应的博客链接为:http://blog.csdn.net/d704791892/article/details/22829133

2014-04-02

CListCtrl控件实现Item项拖拽效果

实现CListCtrl控件的Item项拖拽效果,本源码对应的博客链接为:http://blog.csdn.net/d704791892/article/details/22600075

2014-03-30

MFC实现文件拖拽功能

MFC类库提供的CListCtrl类是不可以拖拽文件的,本代码子类化CListCtrl类,实现文件拖拽功能,供大家参考参考,希望小小代码能够帮到大家解决问题。

2013-04-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除