C++
爱我呦呦
这个作者很懒,什么都没留下…
展开
-
32位64位 long类型所占字节数不同
16位系统:long是4字节,int是2字节32位系统:long是4字节,int是4字节 , long long是8字节64位系统:long是8字节,int是4字节 , long long是8字节long类型的数据在32位和64位的系统中所占用的字节数是不同的如果在32位中使用了long类型的数据协议,那么就会导致在64位的系统中读取long类型的数据发生错误这个时候就要兼容32位和64位如果数据没有超过int的取值范围 就可以将long 改成int如果超过int的取值范..原创 2022-04-16 09:35:32 · 12133 阅读 · 3 评论 -
C++入门教程(24)深入理解递归
递归其实是在学习编程的过程中一个很神奇的东西,初次使用,你会觉得它很不可思议,甚至会觉得它很神奇。如果看过火影的朋友可以将递归理解为大蛇丸的一种忍术:我吐我蛇叔->吐蛇叔->吐蛇叔->吐蛇叔->。。。->吐蛇叔因为不能无限制的吐,总要结束,所以吐剑的时候就结束了,如果吐的不是剑就可以继续吐,哈哈这个吐就可以理解成为我们的递归函数fun()每个递归函数都要有结束的条件,这个条件一般由参数去控制,否则会导致这个递归函数无限的调用下去,使程序异常简原创 2022-04-05 22:36:09 · 1001 阅读 · 0 评论 -
C++入门教程(23)深度优先,广度优先(连连看判断是否可以消除)
最近看一个人实现连连看是否可以消除的核心代码,几分钟就写完了,手痒痒自己写了一遍需求:实现一个函数,输入两个选中的块,判断是否可以消除连连看规则,两个相同的块可以消除,但是需要满足以下条件,两个块的连线上不能有其他块连线的转折次数不能超过2最边界的两个块可以绕出地图一个格子去连线首先是实现连连看的地图,本例使用的是10X10的地图,边界都为0,真是的块只有8X8int map[MaxLen][MaxHeight] = { 0,0,0,...原创 2022-03-28 22:19:30 · 1097 阅读 · 0 评论 -
C++入门教程(22)连续区间最大和问题(股票最大收益)
最近看到一个连续区间最大和的问题,很感兴趣,主要是因为这个问题可以用于求一段时间内的股票最大收益问题。而一段连续的数字就是每一时刻股票的波动情况以某指数为例:下方红绿即为每一时段的变化,对应上方是当前时段对应的价格,在什么时间段买入和卖出才能获取最大的收益呢?我首先想到的就是在最低点买入,最高点卖出了,可以通过遍历求出前N项和,得到股票最高点和最低点的时刻,然后进行交易,最低点买入最高点卖出。但是这样处理有一个问题,就是最高点可能提前于最低点出现,也就是说通过上述方法得到的结果可能为原创 2022-03-27 20:32:26 · 1493 阅读 · 1 评论 -
C++入门教程(21)xml解析(tinyxml2)
tinyxml官网:www.grinninglizard.com右侧点击tinyxml-2跳转到github代码仓库https://github.com/leethomason/tinyxml2下载解压后可以看到目录下有一个vs文件夹在windows环境可以使用这里面的工程用vs打开来查看自带的用例打开以后可能会编译不通过根据提示修改项目->属性->配置属性->调试->工作目录 改为..windowsSDK改为当前可用的然后就可以运原创 2022-03-24 20:42:18 · 1785 阅读 · 0 评论 -
C++入门教程(20)json解析(jsoncpp)
jsoncpp在github上地址:https://github.com/open-source-parsers/jsoncppjsoncpp在使用的时候需要先编译在window上可以使用cmake工具来编译,官方下载地址:https://cmake.org/download/在Linux或者max环境可以先下载jsoncpp到本地,解压后在jsoncpp-master目录下创建一个build目录打开终端:cd 到当前build目录执行命令:cmake ..原创 2022-03-22 21:22:08 · 2525 阅读 · 0 评论 -
C++入门教程(19)多线程 互斥锁(thread)
多线程,当多个任务一起执行的时候,如果有一个任务需要等待的时候,那么我们希望其他的任务能够继续进行,这种情况,就可以使用多线程来处理。例如模拟火车站售卖火车票。假如有两个窗口,每个窗口在出票的时候需要有一段时间来打印车票,这个时候其他的窗口应该可以继续售票,不受影响我们用程序来模拟售票的过程#include <iostream>#include <thread>#include <mutex>using namespace std;//原创 2022-03-20 20:53:17 · 1490 阅读 · 0 评论 -
C++入门教程(18)socket 实现简单聊天室
本节通过socket实现一个简单的聊天室功能聊天室中如果有人说话,则服务器负责将内容传送给聊天室的其他人那么就需要客户端和服务端两个程序,客户端负责发送消息,服务端负责接收和转发消息客户端代码:#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#in原创 2022-03-19 13:51:22 · 9157 阅读 · 2 评论 -
C++入门教程(17)MD5加密以及数据校验
MD5的应用很广泛,可以用于记录文件的md5值以用于检测更新,记录玩家的账号密码等等。由于它的不可逆性,还可以用于校验数据签名,以验证数据的合法性某上线应用程序发现有玩家的货币增长异常,经过后台日志发现,玩家某一时刻充值后,并没有立即请求,而是修改了发送的充值金额,由于订单合法,服务器认为是正常的订单,就放过了,但是实际充值的钱和商品的数量是不匹配的,导致玩家刷走了好多货币。为了防止玩家继续刷币,需要验证发送请求的合法性,增加了一步验证签名的过程验证过程:1)服务器下发一串用于签原创 2022-03-17 17:10:08 · 1830 阅读 · 0 评论 -
C++入门教程(16)Vector容器以及自定义排序
vector是C++封装的一个类模板,可以存放任意类型数据的一种容器从定义上可以看出其实vector是一个类模板template <class _Tp, class _Allocator /* = allocator<_Tp> */>class _LIBCPP_TEMPLATE_VIS vector : private __vector_base<_Tp, _Allocator>{ ...}刚开始接触类模板可能不是很理解,但是顾名思义,原创 2022-03-16 11:19:49 · 4769 阅读 · 0 评论 -
C++入门教程(15)虚析构函数、内存泄漏(virtual,Leak)
虚析构函数可以保证子类析构函数的调用,这样做有什么好处呢?其实这样可以防止内存泄漏。我们接下来看一下实例,假如有如下需求定义一个动物类,动物会叫声明一个Say()函数,子类去各自实现这个Say()表示各种不同的动物的叫声。我们定义两个动物的子类,狗Dog和猫Cat,为了方便查看析构函数是否调用,我们在子类和父类的构造函数和析构函数中都分别输出一段文字。首先来看错误的写法:class Animal {public: int id; public: ...原创 2022-03-15 16:02:13 · 1695 阅读 · 0 评论 -
C++入门教程(14)运算符重载(operator+)
运算符重载赋予了自定义的类可以进行运算符操作的能力,比如自己定义了一个Positon 的坐标类,希望可以通过加减来得到新的坐标,就可以通过运算符重载来实现其实就是实现一个 operator+函数,这个函数以operator开头,接上一个运算符,运算符重载可以提高代码的可读性,如果不使用也可通过其他函数实现,完全可以达到相同的效果。#include <iostream>using namespace std;class Position{ pu原创 2022-03-14 22:18:15 · 3125 阅读 · 0 评论 -
C++入门教程(13)平衡二叉树
说来惭愧,数据结构学了10年了,直到今天才弄明白这个平衡二叉树的代码实现(之前只是知道原理,现在也可以自己造轮子用C++实现了)。平衡二叉树其实就是二叉树,它是二叉树的一种特殊结构,主要是为了提高查找效率假如有1023个节点,那么最多只需要10次就能找到目标节点。转换成平衡二叉树的左旋和右旋的实现,其实就是为了使树平衡,将这棵树做最少的改动。并且前提条件是插入节点之前,这颗树是平衡的,所以只有4种情况会导致树的不平衡1)依次插入3,2,1需要右旋2)依次插入1,2,3 需要左..原创 2022-03-14 16:12:59 · 2207 阅读 · 0 评论 -
C++入门教程(12)快速排序(二叉树)
快速排序的思路比较有趣,1)首先找到一个值,以这个值为基准,将所有比这个数小的数都放在这个值的左边,将所有比这个值大的数都放在这个值的右边2)记下来将找出来左边的和右边的值都按照这个方法排序3)直到每个排序的数组都只剩下两个或一个数字,即可完成比较在实现的过程也是比较有意思,基数比较容易找,可以默认以当前数组的第一位为基数,那么怎么用程序去实现把比基数大和比基数小的两组数区分开来呢?区分开来后我们将得到一个这样的结构...原创 2022-03-10 21:21:43 · 2099 阅读 · 1 评论 -
C++入门教程(11)插入排序(单向链表)
插入排序类似玩扑克牌的时候,一张一张按照从大到小,或者从小到大的顺序插入例如某个玩家一次摸到的牌是 4,J,6,K,Q插入的顺序为以从小到大为例1)第一张牌没有牌与其比较拿在手里就好,此时为42)第二张牌J,找一找有没有手里面的哪张牌比J大,没有,就把J放到最后面,此时为4,J3)第三张牌6,找一找有没有手里面的哪张牌比6大,找到了一张J比6大,所以将6放到J的位置,J和J后面所有的牌就都排在后面了,此时为4,6,J...原创 2022-03-09 21:25:46 · 1519 阅读 · 0 评论 -
C++入门教程(10)冒泡排序(for)
排序是软件开发中最常见的算法问题了,给出一组数据,按照要求对其进行排序,或是从小到大,或是从大到小。今天我们就用C++来实现冒泡排序的过程。实现原理假设以从大到小的排序方式为例,假设共有N个数(A1......An):1)依次比较数组中第一个值和后面的所有值,如果第一个数字小于后面的数字,交换两个数字,这样经过N-1次比较后 得到一个最的值在数组的最前面2)接下来只需要将后面N-1个数排列即可,用第二个数和后面所有数比较,如果第二个数小于后面的数字,就进行交换,得到第二大的数字在第二位3原创 2022-03-08 23:14:31 · 1550 阅读 · 0 评论 -
C++入门教程(9)数组 (int[],数组越界)
在软件开发的过程中,经常会有一组数字一起出现的情况,比如在游戏中的一副扑克排,一个本月的最高分排行榜,一个商品的价格列表等等,这些数组的长度一般都是固定的,这个时候在程序中往往用数组来表示。例如,学校里进行了一次月考,有数学,语文,英语三门。我们实现一个学生类。用于表示每个学生的成绩状况class Student{public: string name; int scores[3]; //数学,语文,英语 int historyHigh[3]; //历史最高成绩};原创 2022-03-07 22:54:31 · 3463 阅读 · 0 评论 -
C++入门教程(8)类的私有成员 (private)
上节我们定义了一个Person类,这一届我们继续深入学习类过年了,假设小明的爸爸和妈妈分别给了小明和小红每人100元的压岁钱,我们用程序来实现这个压岁钱的属性。给Person类定义一个新的成员 moneyclass Person{ public: //布尔类型 bool isBoy ; //整形 int age; //浮点型 float height; //字符型 string name ; //压岁钱原创 2022-03-06 17:42:59 · 8393 阅读 · 3 评论 -
C++入门教程(7)你知道类么(class)
小明:你知道类么?小红:我当然知道累啊小明:那你说什么是类?小红:做久了就会累啊。小明:呃。。。对言归正传,那么上一节我们用一些类型定义了小明的一些身高年龄等属性,那么如果小明的好朋友小红也要定义她的属性,该怎么办呢,其实是可以定义另一个变量比如 ageXiaoHong用来表示小红的年龄,可是这样做会有一个问题,假设我们一个班级有30个同学,那么这30个同学的年龄就需要30个变量来定义ageXiaoMing,ageXiaoHong,ageXiaoGang,.....原创 2022-03-03 22:43:14 · 469 阅读 · 0 评论 -
C++入门教程(6)常用数据类型(bool,int,float,string)
在软件开发过程中,有几种非常常用的数据类型,几乎是一定会用到的,那就是布尔,整形,浮点型,还有字符型,这几种最为常见,基本上没中编程语言都会用到布尔类型:bool,一般可以定义两种状态的属性,比如性别 整形:int,定义没有小数的属性,通常定义个数,或者年龄等浮点型:float,定义有小数部分的属性,例如身高,价格等 字符型:string,定义一个字符,多用于昵称,标签,说明等#include <...原创 2022-03-03 21:54:09 · 1645 阅读 · 0 评论 -
C++入门教程(5)文件操作 (ofstream,ifstream)
每个人在使用应用的过程中都会产生一些数据,这些数据有时候需要保存起来,比如上一节的猜数字游戏,我们想记录最少次数猜中的玩家,每次在游戏开始前先展示。这时候就需要保存这个数据,正常的游戏需要保存到数据库里面,我们暂时还没有学习数据库的相关知识,就先保存在一个文件里面,所以这一节我们学习文件操作#include <iostream>#include <fstream> //引入文件操作的系统库#include <time.h>using na...原创 2022-03-03 20:26:52 · 4070 阅读 · 0 评论 -
C++入门教程(4)猜数字游戏(rand)
上节说到一个猜数字的游戏,我们首先分析下这个小游戏的流程1.首先系统产生一个需要猜的数字N(1<N<100)2.输入一个数字,系统给出是大了还是小了,进一步判断数字的范围3.重复输入数字,直到猜中数字#include <iostream>using namespace std;int main(int argc, const char * argv[]) { // insert code here... //std::cout <<原创 2022-03-01 22:29:36 · 5320 阅读 · 0 评论 -
C++入门教程(3)条件判断(if和else)
上回学习了用户可以随意输入内容让计算机输出,本节我们学习如何判断输入的内容是否正确,简单视线一个账号密码验证的小程序,假设密码是123456789,判断输入是否正确#include <iostream>using namespace std;int main(int argc, const char * argv[]) { // insert code here... //std::cout << "Hello, World!\n"; ...原创 2022-02-28 21:15:23 · 5976 阅读 · 0 评论 -
C++入门教程(2)让计算机跟我读(cin,cout,while)
书接上回,通过print("str");可以让计算机输出我们想让计算机输出的字符串,但是每次都要修改传入的str字符串,而且每次都是固定的字符串,有些呆板。现在我们稍微提高下难度,让计算机实现我们输入什么,计算机就输出什么。直接上代码#include <iostream>using namespace std;int main(int argc, const char * argv[]) { // insert code here... /...原创 2022-02-27 20:13:19 · 438 阅读 · 0 评论 -
C++入门教程(1) 一切从Hello,World开始说起(cout)
前言Hello,Wolrd 是C语言的第一个演示程序,运行后可以在控制台输出“Hello World”这行字符串。一般来说,学习任何编程语言都会先从Hello Wolrd程序开始入手,无论用哪种编程语言,如果你可以让计算机任意的输出一段文字,则表示你可以通过一门编程语言来和计算机进行交互。即你掌握了和计算机交谈的方法。Mac环境用Xcode运行Hello World程序在Xcode中File->New->Project->macOS-...原创 2022-02-26 16:08:59 · 871 阅读 · 0 评论 -
局部静态变量和全局静态变量的区别
局部静态变量和全局静态变量的区别// Mianshiti.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;static int global1;void test1(){ static int num = 0; //静态局部变量 ///只能初始化一次 ,原创 2016-08-11 11:57:35 · 609 阅读 · 0 评论 -
不允许拷贝构造函数传值参数,而必须是传引用或者常量引用
不允许拷贝构造函数传值参数,而必须是传引用或者常量引用class A{private: int value;public: A(int n) { value = n; }//A(A other) 此处这样写会编译报错//A(A &a) //直接传一个引用过来也是可以的 A(const A &other)//必须是传引用或者常量引用 { value =转载 2016-08-20 12:47:00 · 731 阅读 · 0 评论 -
子类构造和析构被执行时是否调用父类以及调用顺序
子类构造和析构被执行时是否调用父类以及调用顺序子类被构造的时候回先调用父类的构造函数子类析构的 时候先析构子类后析构父类如果直接用子类构造一个父类的对象,删除这个父类的对象不会调用子类的析构函数(父类的析构函数为虚函数除外)示例代码://A是一个父类 , 析构函数不是虚函数class A{public: A() {原创 2016-08-20 12:36:49 · 5516 阅读 · 1 评论