![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 71
春风来不来
CXY 进化中
展开
-
实现智能指针
AutoPtr资源的转移不推荐使用。 旧库使用拥有者会导致野指针实现代码template <class T>class AutoPtr{public: AutoPtr(T* p = NULL) : _ptr(p) {} AutoPtr(AutoPtr<T>& ap) :_ptr(ap._ptr) { ap._ptr原创 2017-08-06 18:28:11 · 410 阅读 · 0 评论 -
【数据结构】实现大小堆也叫二叉堆(类似c++中的优先队列)
二叉堆:是一种特殊的堆,依赖于完成完全二叉树和向量实现的。分为最大堆和最小堆。最大堆:父节点的键值总是大于或等于任何一个子节点的键值。最小堆:父节点的键值总是小于或等于任何一个子节点的键值。存储:二叉树一般用数组来存储表示,在下面的实现中使用了STL中的vector。根节点在数组中的位置是0,第n个位置的左孩子下标为n*2+1,右孩子为2*n原创 2017-02-25 15:08:35 · 829 阅读 · 0 评论 -
【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)
思路:用两个栈来实现,栈sData存放入栈元素,栈sMin存放最小值。按照元素入栈顺序,将要入栈的第一个元素,同时压入两个栈中。后续每个元素入栈时,与sMin栈中栈顶元素比较大小,若入栈元素data 小于sMin栈顶元素,则把data同时压入两个栈中,若data大于sMin栈中栈顶元素,则只压入栈sData中。出栈时,判断两个栈顶元素是否相等,若相等则两个栈同时执行出栈操作,不相等原创 2017-02-15 21:02:50 · 4435 阅读 · 1 评论 -
求出区间[a,b]中所有整数的质因数分解。
问题描述 求出区间[a,b]中所有整数的质因数分解。输入格式 输入两个整数a,b。输出格式 每行输出一个数的分解,形如k=a1*a2*a3...(a1样例输入3 10样例输出3=34=2*25=56=2*37=78=2*2*29=3*310=2*5提示 先筛出所有素数,然后再原创 2017-01-23 19:02:18 · 9072 阅读 · 1 评论 -
【c++】模拟实现顺序队列方法二
这是模拟实现顺序队列的第二种方法。就是队头保持不变,队尾在变。入队时,队尾向后走,出队时将除队头以外的所有数据向前移动一步。如下如示例:1.代码示例// 顺序队列实现方法2 (非循环队列) 对头保持不变#include #include using namespace std;template class Queue原创 2016-12-31 16:28:54 · 620 阅读 · 0 评论 -
【c++】模拟实现顺序队列方法一
这是模拟实现顺序队列的第一种方法。就是入队时队尾在不断后移,直到满,出队时队头不断后移,直到空。如下如示例:代码以及简单测试:#include // assert();#include using namespace std;// 头在不断变的顺序队列 (非循环队列)templateclass Queue{ public:原创 2016-12-31 14:45:06 · 575 阅读 · 0 评论 -
【c++】模拟实现栈 类模板(Stack的基本操作)
// 坏境 win7 x64 vs2012#include #include using namespace std;template class Stack{public: // 构造函数 explicit Stack(const size_t capacity = 10) :_size(0) ,_capacity(10) { // 最小分配10个 大于10原创 2016-12-30 21:09:56 · 1655 阅读 · 0 评论 -
【C++】简单实现String类--深拷贝的普通版本和简洁版本
String 深拷贝普通版本#define _CRT_SECURE_NO_WARNINGS // 去除 vs下 函数不安全的警告#ifndef _STRING_H_#define _STRING_H_#include using namespace std;// 深拷贝的普通版本class String{private: char* _data; public原创 2016-12-27 21:45:53 · 555 阅读 · 0 评论 -
【c++】利用递归实现走迷宫
要求:1、将地图的数组保存在文件中,从文件中读取行列数2.、动态开辟空间保存地图3.、运行结束后再地图上标出具体的走法说明:1、文件中第一行分别放置的是地图的行数和列数2、其中1表示墙,即路不通,0表示路,即通路3、程序运行结束后用2标记走过的路径4、当走到“死胡同”时用3标记此路为死路5、每到一个点,原创 2016-12-24 18:40:20 · 5448 阅读 · 0 评论 -
【c++】template简述
模板简述面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同的是,OOP处理的是在程序运行之前都未知的情况,而在泛型编程中,是在编译时期就已经知道了类型。可以将模板理解为公式,当我们在使用的时候,提供足够的信息,编译器就会替我们生成特定的函数或者类,而不用编程人员为每一种类型都去实现大量重复的代码,大大提高了我们的编码效率。函数模板我们可以定义一个通用的函数模板(functio原创 2017-04-21 18:46:13 · 433 阅读 · 0 评论 -
【数据结构】向STL看齐-模拟实现红黑树
目标:回顾模板分离编译,掌握平衡树树的左旋和右旋,掌握红黑树插入过程调整逻辑,即旋转及变色的分类。红黑树的特点:1、任意一个结点要么是红色,要么是黑色2、根结点是黑色3、一条路径上不能出现两个连续的红色结点4、从根节点到任一叶子节点的黑色结点个数相同5、NUL结点默认为黑色结点(可忽略)使用模板分离编译实现红黑树的基本操作:插入、判空、查找是否存在、个数、中序打印等。原创 2017-05-16 15:11:42 · 561 阅读 · 0 评论 -
快速排序的三种实现方式以及非递归版本
一、快速排序的基本思想 快速排序利用了分治的思想,分而治之。通过一趟排序将序列分为两部分,其中一部分比较关键字小,一部分比关键字大。之后继续对这两个子序列重复此过程,直到整个序列都有序。二、快速排序的三个步骤* 选基准值*:在要排序的序列中选一个几个基准值,作为划分区间的 关键字。通常选取关键字的方式对效率有很大的影响。* 分割序列*:按照基准值把序列分为两部分,左边的小于基准值,右边的大原创 2017-07-02 22:30:59 · 15990 阅读 · 9 评论 -
C 语言实现多态和继承
C语言模拟实现C++继承和多态提示:C 实现一个 struct A 和 stuct B 包含一个 int 成员 a 和 b,要求达到B 继承 A 的效果,也就是 B里面包含一个 A,并且能达到多态的效果,也就是一个 A* p 指向一个指向A 调的是 A 的函数,指向 B 调的是 B 的函数。原创 2017-07-30 11:34:09 · 1079 阅读 · 0 评论 -
排序算法之直接插入排序、二分插入排序和希尔排序
下列所有排序都默认是升序,从小到大。插入排序有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部原创 2017-06-25 19:14:14 · 1101 阅读 · 0 评论 -
【c++】深入剖析虚拟继承与各种继承关系中派生类内成员内存分布情况及虚基类表的内容
单继承 多继承 多重继承 菱形继承 单继承与虚继承 多继承与虚继承 多重继承与虚继承 菱形继承与虚继承 虚基类表指针 虚基类表 不同继承方式成员对面模型 内存分布情况 赋值顺序原创 2016-11-13 23:31:03 · 2396 阅读 · 1 评论 -
获取函数运行时间的两种方法
第一种:使用 GetTickCount()函数该函数返回从系统运行到现在所经历的时间,返回类型为 DWORD,是unsigned long 的别名,单位为ms。#include <iostream>#include <windows.h>void TestFun(){ // 测试函数...}int main(){ DWORD start_time = GetTickCoun原创 2017-07-02 20:34:43 · 1876 阅读 · 0 评论 -
图的邻接矩阵与邻接表存储方式及优缺点对比
概述 记录一些图的基本概念,以及图的两种表示方式(邻接表和邻接矩阵)的代码实现,最后总结了两种方式的优缺点,还简单介绍了十字链表和逆邻接表。图的部分基本概念(我记不住的)1、完全图一个无向图,任意两个顶点之间有且仅有一条边,则称为无向完全图。若一个无向完全图有 n 个顶点,那么它就有 n∗(n−1)/2n*(n-1)/2 条边。 一个有向图,任意两个顶点之间有且仅有方向相反的两条边,则称为有原创 2017-07-11 16:44:59 · 39224 阅读 · 3 评论 -
二叉搜索树详解及实现代码(BST)
概念二叉搜索树(Binary Search Tree),又称二叉排序树,它或者是一颗空树,或者具有如下性质的树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树基本操作插入向二叉搜索树中插入新元素时,必须先检测这个元素是否在树中已经存在。如果已经存在,则不进行插入,如果元素不存在则将新元素插入原创 2017-04-15 22:10:01 · 5425 阅读 · 3 评论 -
使用C语言打印不同星号图案(矩形 平行四边形 三角形)
打印自定义行数的矩形打印效果:参考代码:#includeint main(){ int i,j,n; printf("请输入要打印矩形的行数:"); scanf("%d",&n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("* ");原创 2016-06-25 10:35:59 · 74545 阅读 · 7 评论 -
【c++】利用循环和栈实现走迷宫
要求:1、将地图的数组保存在文件中,从文件中读取行列数2.、动态开辟空间保存地图3.、运行结束后再地图上标出具体的走法说明:1、文件中第一行分别放置的是地图的行数和列数2、其中1表示墙,即路不通,0表示路,即通路3、程序运行结束后用2标记走过的路径4、当走到“死胡同”时用3标记此路为死路5、每到一个点,按照 左 上 右 下 的顺序去试探6、没原创 2016-12-24 17:42:00 · 3195 阅读 · 1 评论 -
【c++】多态总结
什么是多态?多态是指相同对象收到不同消息,或不同对象收到相同消息时产生不同的动作。多态的分类:1、静态多态【早绑定】指相同对象收到不同消息时产生不同的动作。比如说,函数重载,计算两个数的和的函数Add,可以是Add(int a, int b)计算两个整型的和, 也可以重载为Add(double a, double b),这里函数Add就是相同的对象,而参数就是发出原创 2016-12-23 21:05:37 · 393 阅读 · 0 评论 -
C语言知识框架图-6大版块
原创 2016-11-05 17:33:37 · 5379 阅读 · 0 评论 -
c++预处理器概述 #define #ifdef #ifndef #endif
预处理器: 确保头文件多次包含仍能安全工作,即可以有效地防止头文件重复包含的发生.原创 2016-10-22 19:55:54 · 1990 阅读 · 0 评论 -
单链表操作之合并两个有序单链表---递归 and 非递归实现
问题提出:现有无头结点有序单链表pHead1和无头结点有序单链表pHead2,要求将两个链表合并后依然有序。如: pHead1 为 1 3 5 7 9 pHead2 为 2 4 6 8 10 合并后 为1 2 3 4 5 6 7 8 9问题解决:(1)递归实现1.对空链表存在的情况进行处理,原创 2016-09-23 21:02:54 · 13836 阅读 · 0 评论 -
文件读写操作+动态内存分配+结构体指针+函数指针数组实现通讯录系统
实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1. 添加联系人信息2. 删除指定联系人信息3. 查找指定联系人信息4. 修改指定联系人信息5. 显示所有联系人信息6. 清空所有联系人7. 以名字排序所有联系人8. 保存现有文件到桌面的通讯录.txt文件9. 从原创 2016-08-09 23:44:41 · 1670 阅读 · 0 评论 -
调整数组使奇数全部都位于偶数前面。 题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。#include #include void sort(int *a,int sz){ int i = 0; int j = sz-1; for(i=0; i!=j; i++) { if(a[i]%2!=0) continue;原创 2016-08-02 18:24:14 · 3489 阅读 · 0 评论 -
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。看到这道题的 第一件事情就是把思路先捋一捋为了好理解 用0来表示不是凶手 1表示是凶手我们先假设所有人都是清白的也就原创 2016-07-21 17:31:15 · 5783 阅读 · 7 评论 -
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
用数组实现:#include int strlen(char *arr){ char *ret=arr; while((*ret++)!='\0') ; return ret-arr-1;}char* reserve_a(char *arr){ int sz = strlen(arr); int lift = 0; char tem; int i = 0; in原创 2016-07-25 22:02:05 · 672 阅读 · 0 评论 -
用C语言写三子棋游戏
#include #include enum G{ EXIT, PLAY};void menu(){ printf("##############1.开始游戏##############\n"); printf("##############0.退出游戏##############\n");}void fill(char a[3][3]){ int ran1 = 0原创 2016-07-22 20:40:49 · 2531 阅读 · 2 评论 -
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 确定比赛的名次
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果A选手说:B第一,我第三。B选手说:我第二,E第四。C选手说:我第一,D第二。D选手说:C最后,我第三。E选手说:我第四,A第一。比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。当时看到这道题自己先在本子先算出来结果后 上网查了下答案 算的是对的 但是当要让计算机理解时就一脸懵逼,也看了网上的一原创 2016-07-21 15:25:36 · 2226 阅读 · 0 评论 -
编译器优化代码都干了些什么不为人知的事情?
首先介绍两个优化概念常量传播 将编译期间可计算出结果的变量转换成常量,减少了变量的使用。 int main(){ int nVar = 1; printf("nVar = %d \n", nVar);}变量nVal是一个在编译期间可以计算出结果的变量,借助常量传播代码等价于:int main()原创 2016-10-23 13:23:28 · 1941 阅读 · 0 评论 -
c++ 实现双向链表构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等
构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等原创 2016-11-05 17:20:31 · 2708 阅读 · 0 评论 -
c++中 this指针详解
this 是 c++中的一个关键字,也是一个常量指针,指向当前对象,也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。【特性】1. this指针的类型是 类类型* const2. this指针并不是对象本身的一部分,不会影响sizeof的结果3. this的作用域在类成员函数的内部4. this指针是类成员函数的第一个默认隐含参数,原创 2016-10-15 17:02:09 · 3791 阅读 · 4 评论 -
【c++模板】模拟实现有模板的双向链表(List)(声明和定义分离)
List.h#pragma once/* 环境: win7 64位 vs2012 */#include using namespace std;templatestruct Node{ Node(const T& value) :_value(value) ,_pPre(nullptr) ,_pNext(nullptr) {} T _value; Nod原创 2016-11-24 14:42:24 · 393 阅读 · 0 评论 -
【c++】实现双向链表List类及测试
【c++】实现双向链表List类及测试(拷贝,构造,赋值重载,头插尾插,头删尾删等)原创 2016-11-22 09:52:48 · 965 阅读 · 0 评论 -
【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序
一、派生类对象中基类构造函数和派生类中构造函数调用顺序(WIN7 64位 VS2012)(1)、先执行派生类的构造函数还是先执行基类中的构造函数?利用下面这段代码进行打印测试#include using namespace std;// 基类class BaseClass{public: BaseClass() { cout << "BaseClass()" <<e原创 2016-11-12 16:20:45 · 5530 阅读 · 0 评论 -
大端小端模式简单介绍 以及三种检测大小端存储的方法
大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。原创 2016-08-08 23:41:35 · 7418 阅读 · 0 评论 -
c++实现日期类(class Date) 构造函数 拷贝构造 操作符重载(输入输出 比较操作 算数运算 自增自减)
c++实现日期类(class Date) 构造函数 拷贝构造 操作符重载(输入输出 比较操作 算数运算 自增自减)原创 2016-10-30 00:22:08 · 3413 阅读 · 0 评论 -
【c++继承】继承是什么,生活中的继承,访问限定符对继承有哪些影响?
继承一、继承是什么通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类称为基类(Base Class)或者父类。由基类派生出的新类称为派生类(Derived Class ),又称为子类。继承也是代码复用最重要的手段。二、生活中的继承原创 2016-11-08 23:03:58 · 1084 阅读 · 0 评论 -
引用与指针的区别
引用的那些事:1.引用必须被初始化2.定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用3.一旦初始化完成,引用无法重新绑定到另外一个对象(嫁鸡随鸡嫁狗随狗)4.引用只是为一个已经存在的对象起的另外一个名字5.定义一个引用后,对其进行的所有操作都是在与之绑定的对象上进行的6.为引用赋值,实际上是把值赋给了与原创 2016-10-18 17:26:08 · 466 阅读 · 0 评论