C++
文章平均质量分 54
poison_biti
这个作者很懒,什么都没留下…
展开
-
深浅拷贝和写时拷贝
拷贝: 事实是,在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。浅拷贝: 缺省拷贝构造函数在拷贝过程中是按字节复制的,对于指针型成员变量只复制指针本身,而不复制指针所指向的目标--浅拷贝。浅拷贝的代码原创 2017-07-25 22:07:38 · 566 阅读 · 0 评论 -
蓝桥——数星星
“test.cpp”#includeusing namespace std;#includevoid test(){ string str; getline(cin,str); string str2; int count = 0; for(int i = 0;i < str.size();i++) { if(str[i] != ' ') { if(str[原创 2016-11-05 10:54:45 · 695 阅读 · 0 评论 -
面试题——不用循环计算1+2+...+100之和
前几天看到校招的面试题,要求不要用循环计算出1+2+3...+100之和。当我看到这道题的时候第一反应就是用递归写,能用循环的程序不一定能用递归去写,但是能用递归的程序一定可以用循环写出。所以递归和循环是相铺相成的。 这里我也不知道递归是不是面试考官想要的最优写法,但是这题至少没用循环。这里我写完后修改了下代码,不仅仅是只计算1+2+3...+100的程序,输入一个最小的数字(如5原创 2016-09-28 14:51:35 · 2104 阅读 · 0 评论 -
指针和数组——面试基础(1)
刚开始学习编程的时候总以为数组就是指针,指针就是数组,容易混淆。其实,数组和指针是有区别的。数组与指针的区别:数组:1、数组要么在静态存储区被创建(全局数组),要么在栈上被创建(局部数组)2、数组名对应着(不是指向)一块内存(大小已知),其地址与容量在生命周期内保持不变,只有数组内容 可以改变。指针:1、指针可以随时指向任意类型的内存块(不同类型可以通过强制类原创 2016-09-23 13:48:54 · 440 阅读 · 0 评论 -
贪吃蛇——C++经典小游戏
贪吃蛇的游戏规则:上下左右方向键控制贪吃蛇游动,不要撞到墙、不要碰到自己身体,每次吃到食物速度都会加快。原创 2016-09-22 23:31:59 · 3418 阅读 · 1 评论 -
二分查找——递归与非递归
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功,返回当前位置下标;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查原创 2016-09-06 11:46:17 · 840 阅读 · 0 评论 -
排序(6)——快速排序及其优化
“test.cpp”#includeusing namespace std;int MidNode(int* arr,int left,int right){ int tmp = arr[left]; while(left < right) { while(left = tmp) { right--; } swap(arr[left],arr[right]原创 2016-09-13 18:48:28 · 316 阅读 · 0 评论 -
哈希表——直接定址法
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 哈希表的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组原创 2016-08-23 14:49:34 · 3511 阅读 · 0 评论 -
C++实现单链表(类和对象)——简单实现
"test.cpp"#define _CRT_SECURE_NO_WARNINGS 1#include using namespace std;#include "LinkList.h"void Test(){ LinkList list; for (int i = 1;i < 6;i++) { list.PushBack(i); } cout<<list<<endl原创 2016-08-22 16:04:52 · 732 阅读 · 0 评论 -
C++实现动态顺序表(类和对象)
在我之前写的博客里,写过用C语言实现顺序表的博客(你们可以去看看哟),最近重新复习了C++,决定用C++重新实现一遍顺序表咦巩固我的基础。这里我用的是类来实现顺序表,下面是我代码的实现,简单易懂:"test.cpp"#define _CRT_SECURE_NO_WARNINGS 1#include using namespace std;#include "SeqList.h"v原创 2016-08-21 15:21:27 · 571 阅读 · 0 评论 -
连连看——C++简单小游戏
连连看(本次只处理了0转弯和1转弯的情况,2个转弯的情况还没有解决)连连看的规则大家可能都知道,这里的就不重复废话了。这个游戏实现的特别LOW,不过没办法本人能力有限,正在努力的学习以完善这个游戏。代码比较简单,注释代码中都有,我就不做详细的介绍了,相信以你的能力,你很快就能弄明白。“test.cpp”#define _CRT_SECURE_NO_WARNI原创 2016-12-21 21:32:47 · 9293 阅读 · 2 评论 -
字符串和数字的转换
#includeusing namespace std;#include void test(){ //将字符串转成数字 int num = 0; stringstream ss1("5432532"); ss1>>num; cout<<num<<endl; //将数字转成字符串 num = 987; stringstream ss2; ss2<<num; cout原创 2017-01-03 20:40:34 · 785 阅读 · 0 评论 -
重载,重写(覆盖),隐藏
重载: 是指同一作用域内被声明的几个具有不同参数列表(参数的类型,参数的个数的不同)的同名函数。根据参数列表确定调用哪个函数,重载不关心函数返回类型。重载函数通常用来描述一组功能相似的函数,这样做可以减少函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。编译器是怎么解决命名冲突的问题的? 重载的函数名在反汇编代码下,所有的函数名全部变成了“返回值原创 2017-07-21 15:06:38 · 394 阅读 · 0 评论 -
实现多态——虚函数的对象模型
多态的概念:(一个接口,多种方法) 多态是面向对象语言的三大特性(封装,继承,多态)之一,多态是指同一个实体具有多种形态。C++中的多态具体体现在编译和运行时期,编译时期就确定对象使用的形式(重载)我们成为编译时多态,运行时期才能确定 具体引用的对象使用的形式我们称为动态多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的结果。多态在继承模型下实现,在运行时,可以通过指向基类(原创 2017-07-21 12:16:39 · 427 阅读 · 0 评论 -
虚继承和虚基类的对象模型
概念 为了解决不同途径继承来的同名的数据成员和成员函数在内存中有不同的拷贝造成数据不一致的问题,将共同的基类设置为虚基类。这时,不同路径继承下来的同名的数据成员在内存中只有一个拷贝,成员函数名也只有一个映射。这样解决了二义性的问题,避免了数据不一致的问题,也节省了内存。解决办法: 解决数据二义性的问题的办法就是虚继承,将共同的基类设置成虚基类。在多继原创 2017-07-21 10:00:25 · 586 阅读 · 0 评论 -
构造函数和析构函数的重载和虚函数的问题
关于作用:构造函数:用于处理对象的初始化,在实例化对象进入作用域的时候自动调用构造函数。析构函数:用于在撤销对象占用内存之前完成一些清理工作,在对象生命周期结束时自动调用。关于重载:构造函数:构造函数可以被重载,因为构造函数可以有不同的参数类型和参数个数,所以构造函数可以有多个。析构函数:析构函数不可以被重载。析构函数只可以有一个,无参数决定了其不能被重载。原创 2017-07-08 15:02:23 · 1525 阅读 · 0 评论 -
C/C++中static函数
C/C++中static函数 将函数声明成static函数,那么这个函数只可以在所处的文件中被调用,不能被其他文件调用。而且声明成static函数以后,即使这个函数名和其他文件中的函数名一样,不会引起冲突,也不会引起编译器调用时的二义性。静态函数只初始化一次。static函数的生命随进程,只有进程退出了,才会使这个进程的静态存储区的东西随着进程资源的释放而释放。原创 2017-07-14 19:13:07 · 806 阅读 · 1 评论 -
如何定义一个不能被继承的类
方法一:将构造函数声明为私有的如果把一个类的构造函数声明为私有的,那么这个类就不能被继承。但是这也引入了一个问题,不能在类外定义这个类的对象,所以我们还需要在类内定义一个静态的成员函数来返回创建的这个对象。class AA { public: static AA GetObject(int a) {原创 2017-07-05 14:40:42 · 835 阅读 · 0 评论 -
如何定义一个只能在堆上生成对象的类
我们必须要了解的一些关于堆和栈的基础知识:在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。 动态建立类对象,是使用new运算符将原创 2017-07-05 14:16:03 · 266 阅读 · 0 评论 -
如何定义一个只能在栈上生成对象的类
我们必须要了解的一些关于堆和栈的基础知识:在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。 动态建立一个类对象,是使用new运算原创 2017-07-05 14:25:07 · 231 阅读 · 0 评论 -
程序员面试宝典——子串判断
时间限制:3秒 空间限制:32768K 热度指数:545 本题知识点: 字符串 高级结构 题目描述现有一个小写英文字母组成的字符串s和一个包含较短小写英文字符串的数组p,请设计一个高效算法,对于p中的每一个较短字符串,判断其是否为s的子串。给定一个string数组p和它的大小n,同时给定string s,为母串,请返回一个bool数组,每个元素代表p中的对应字符串原创 2016-12-20 22:47:15 · 673 阅读 · 0 评论 -
模拟实现String类(1)_深拷贝
"test.cpp"#define _CRT_SECURE_NO_WARNINGS 1#include using namespace std;#include "Sring.h"void Test1(){ String str1("hello"); cout<<str1<<endl; String str2("haha"); cout<<str2<<endl; Stri原创 2016-08-20 14:06:16 · 433 阅读 · 0 评论 -
模拟实现String类(2)——写时拷贝
大家都知道,重复的开辟空间和释放内存是很耗时的,效率也很低下,相对于写时拷贝,深拷贝就很耗费时间了,效率自然没有写时拷贝好。 写时拷贝是用一个计数器记住当前空间被多少个指针所指向,每次调用析构函数的时候,只需要看看自减后引用计数是否为零(是否只被最后一个指针所指向)。如果是,则销毁空间,如果不是,那么只需要引用计数减减即可,无需释放空间。 写时拷贝是一种高性能的写法,原创 2016-08-21 13:22:15 · 346 阅读 · 0 评论 -
双向链表——基本操作
"test.c"#define _CRT_SECURE_NO_WARNINGS 1#include "DoubleSLishtNode.h"void Test1()//InitDSList PushBack PrintfDSList PopBack{ PDoubleSListNode pHead = NULL; InitDSList(&pHead); Pus原创 2016-06-02 13:43:23 · 606 阅读 · 0 评论 -
实现日期类
"Data.h"#ifndef __DATA_H__#define __DATA_H__#include using namespace std;class Data{public: Data(int year = 1995,int month = 8 ,int day = 1) :_year(year) ,_month(month) ,_原创 2016-06-02 18:08:53 · 502 阅读 · 0 评论 -
栈的基本操作——顺序栈的类模板定义
栈和队列都是特殊的线性表,是限制存取位置的线性结构;可以由顺序表实现,也可以由链表实现。什么是栈栈定义为:只允许在表的一端进行插入和删除的线性表。允许进行插入和删除的一端叫做栈顶(top),而另一端叫栈底(bottom)。栈中没有任何元素时,称为空栈。设给定栈s=(a0,a1,……,an-1),称a0为栈底,an-1为栈顶。栈又称作后进先出(LIFO:Last In First O原创 2016-06-13 15:09:56 · 2048 阅读 · 0 评论 -
队列的基本操作——链式队列的类模板定义
定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表 (1)允许删除的一端称为队头(Front)。 (2)允许插入的一端称为队尾(Rear)。 (3)当队列中没有元素时称为空队列。 (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。 队列的修改是依先进先出的原则进行的。新来的成原创 2016-06-13 17:16:53 · 1015 阅读 · 0 评论 -
栈和队列相关面试题(1)
1、实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)2、使用两个栈实现一个队列3、使用两个队列实现一个栈原创 2016-06-14 13:35:17 · 691 阅读 · 0 评论 -
栈和队列相关面试题(2)
4、元素入栈、出栈顺序的合法性,如入栈的序列为(1,2,3,4,5),出栈序列为(4,5,3,2,1)原创 2016-06-14 14:57:40 · 654 阅读 · 0 评论 -
栈和队列相关面试题(3)
5、一个数组实现两个栈思路:双向增长法 两个栈的栈底分别指向数组的两端,栈顶不断向另一个栈的栈底靠近。过程: 1、假设以数组首端为栈底的栈叫Stack1,以数组尾端为栈底的栈Stack2,那么当Stack1的栈顶指针大于Stack2的栈顶指针时,需扩容 2、在实现Push与Pop操作是需要多传一个参数flag以确定是对哪一个栈进行操作思路2原创 2016-06-14 19:42:13 · 592 阅读 · 0 评论 -
排序(2)——插入/希尔/选择/快速排序及优化
"Sort.h"#pragma once#include using namespace std;#include #include void InsertSort(int* arr,size_t size)//直接插入排序{ assert(arr); for (int i = 1;i < size;i++) { int j = i-1; i原创 2016-06-16 16:26:11 · 390 阅读 · 0 评论 -
进度条代码的编写
#define _CRT_SECURE_NO_WARNINGS 1#include#include#include#includevoid proc(){ int i = 0; char proc_buf[102]; const char* lable = "\|-\\"; memset(proc_buf,'\0',sizeof(proc_buf))原创 2016-06-25 16:40:10 · 1008 阅读 · 0 评论 -
排序----冒泡排序的优化_选择排序_插入排序
"test.c"#define _CRT_SECURE_NO_WARNINGS 1#include "Sort.h"int main(){ int arr[] = {6,3,8,1,4,9,5,0,2,7}; int size = sizeof(arr)/sizeof(arr[0]); BubbingSort(arr,size); //SelectSort(ar原创 2016-06-01 21:39:18 · 736 阅读 · 0 评论 -
棋盘游戏
简单的棋盘游戏,简单的三子棋玩法,和这个代码类似的话还可以写出五子棋等棋盘游戏原创 2016-07-19 20:04:43 · 598 阅读 · 0 评论 -
排序(5)——堆排序
“test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;#includevoid HeapAdjust(int* arr,int parent,size_t size){ assert(arr); int child = 2*parent+1; while(child && child <原创 2016-09-10 13:44:10 · 277 阅读 · 0 评论 -
排序(4)——希尔排序
“test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;#includevoid ShellSort(int* arr,size_t size){ assert(arr); int tmp = 0,i = 0,j = 0,count = size; do { count = coun原创 2016-09-09 22:14:17 · 263 阅读 · 0 评论 -
排序(3)——插入排序
“test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;#includevoid InsertSort(int* arr,size_t size){ assert(arr); int i = 1; while(i < size) { int j = 0; int tmp = ar原创 2016-09-09 22:12:54 · 225 阅读 · 0 评论 -
排序(2)——选择排序及其优化
“test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;#includevoid SelectSort_OP(int* arr,size_t size){ assert(arr); int min = 0; int max = 0; for(int i = 0;i < size;i++)原创 2016-09-09 20:07:29 · 326 阅读 · 0 评论 -
排序(1)——冒泡排序及其优化
“test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;//优化趟数里的次数void BubbleSort_OP2(int* arr ,size_t size){ int n = 0; int m = size-1; bool flag = true; for(int i = 0;i <原创 2016-09-09 14:15:46 · 339 阅读 · 0 评论 -
多括号匹配——栈的应用
EOF ctrl+z 停止 EOF为计算机术语End Of File的缩写。在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。在C标准库中,像getchar这样的数据读取函数返回一个与符号(宏)EOF相等的值来指明文件结束的情况发生,EOF的真实值与不同的平台有关(但通常是-1,比如在glibc中),并且不等于任何有效的字符代码。块读取函数返回读取的原创 2016-08-04 17:10:32 · 969 阅读 · 0 评论