c++
嘿克不黑
因为热爱,成就梦想。
展开
-
wstring和string之间的转换
inline std::string ws2s(const std::wstring& wstr){ using convert_typeX = std::codecvt_utf8<wchar_t>; std::wstring_convert<convert_typeX, wchar_t> converterX; return converterX.to_bytes(wstr);}inline std::wstring s2ws(const std::st..原创 2021-04-30 09:57:00 · 602 阅读 · 0 评论 -
删除vector中的元素
很多初学者可能会写出如下错误代码错误示范:删除nums里面的1std::vector<int> nums= {1, 2, 3, 4};for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); it++) { if (*it == 1) { nums.erase(it); } }这样写就说明大家对erase的用法不清楚而导致的,erase用法.原创 2021-03-09 18:47:20 · 330 阅读 · 0 评论 -
非常量引用的初始值必须是左值
1 、左值和右值在C++中,左值可以出现在赋值语句的左边和右边;右值只能出现在赋值语句的右边,不能出现在赋值语句的左边。变量是左值,常量是右值。2 引用引用(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。通过在变量名前添加“&”符号来定义。引用具体的使用方法请参考《C++的引用与重载函数》。3 非常量引用的初始值必须是左值3.1 产生原因自定义函数increment()的代码为void increment(double&am.原创 2020-11-20 20:46:46 · 5709 阅读 · 2 评论 -
C语言的scanf怎么没执行?
这是因为在上一次使用scanf后没有清空输入缓du存, 这样你再次使用scanf的时候函数就可能会认为你已经输入过了。解决这一问题的最简单办法是在接收字符的scanf的控制符"%c"中的%前加一个空格写成" %c",把前一次输入遗留在输入缓冲区里的所有广义空格(' '、'\t'、'\n'等)都吸收掉。扩展资料:函数原型int scanf(const char * restrict format,...);函数 scanf() 是从标准输入流stdin(标准输入设备,一般指向键盘)..原创 2020-06-13 18:07:54 · 2472 阅读 · 4 评论 -
2048
经典的 2048 游戏的 C/C++ 实现!这是个益智游戏,规则很简单,按上、下、左、右键,使游戏区域的所有方块向该方向滑动,每次滑动时,相碰的两个相同数字会合并。同时,空白的地方也会在随机出现一个数字方块(2 或者 4)。游戏目标,是想办法合成 2048 这个数字方块。执行效果如下:完整的源代码如下:#include <easyx.h>#include <string.h>#include <map>#include <sstream&转载 2020-05-17 16:23:19 · 3278 阅读 · 8 评论 -
博弈五子棋(人机对战)算法改进
基于 EasyX 的五子棋程序。界面依旧,唯一不同的是算法。改进前的 AI 眼光短浅,只顾当前局面。改进后的 AI 使用 DFS(深度优先搜索)进行对博弈树的遍历,再挑选分值最大的根节点进行落子。具体的,就是先算出每个点的当前分值,再递归去寻找落子后对方分值,把这两个值相减,就可以得到这个位置真正的分值。可是如果直接递归,时间复杂度很大,大约是 O((192)n)( n 为递归次数),于是就加入了两个剪枝(只查找周边有棋子的空位)(如果位置初始分值大于最大分值才递归)和层数限制(只考虑以后4步)。转载 2020-05-17 16:00:20 · 1848 阅读 · 0 评论 -
诺基亚经典贪吃蛇
代码描述纯代码实现的经典贪吃蛇。相信贪吃蛇是不少人儿时的美好记忆。诺基亚的像素版贪吃蛇,曾经风靡一时。今天,我用 EasyX 实现了它。操作方法可通过 wasd 或上下左右键控制蛇的移动。通过食物的成员函数 color 将吃掉食物后增加的节颜色设定为吃掉食物的颜色。每得 500 分,增加一个食物,但食物总数不超过 10 个。撞墙或撞到自己即为死亡。代码简述蛇的移动原理:保存每一节的坐标信息,移动时将除头之外每一节移动到它前面一节的坐标,并通过当前方向移动蛇头。详见代码。使转载 2020-05-16 13:59:07 · 836 阅读 · 0 评论 -
学习 C/C++ 语言的常用开发工具下载
学习编程首先需要安装一款编译器。但是目前的网络环境,很多网站下载到的编译器都被捆绑了各种广告插件,甚至木马病毒,困扰了很多初学者。本页面列出来的各种编译器及下载地址,我都亲自测试过,确保无毒无害无恶意广告插件,请放心下载。ps:如果某个资源无效了,请针对本文发表评论,我会收到提醒。如果你是初学者不知道选择哪个,相信我,选择 VC2010 学习版就挺好。不要听信某些人说 Linux 更适合学编程什么的鬼话,也别信什么 Code::Blocks 可以跨平台的噱头。学编程就是学编程,学会了编程再说系统或跨平台转载 2020-05-16 13:35:06 · 551 阅读 · 0 评论 -
如何封装EXE安装程序
【Inno Setup教程、程序打包、EXE封装、制作EXE安装程序、EXE打包】有时我们需要将软件的的多个文件或者是绿色软件、非安装类软件,打包成一个可执行的exe安装程序,方便进行安装。EXE封装的工具和方法有很多种,本文以Inno Setup软件为例,介绍简单的向导模式,下面是操作方法。工具/原料 Inno Setup 编译器 要封装的软件文件 方法/步骤 1 下载并安装Inno Setup 编译器; 2 安装完成后打开Inno Setup转载 2020-05-14 13:45:20 · 882 阅读 · 0 评论 -
推箱子小游戏 C语言 共写了四十关,游戏有多种模式,适合新手学习交流 有全部完整代码可直接编译运行
游戏源代码在最下面↓ 这是自己用写的C语言推箱子小游戏,总共有两个版本,第一个是控制台应用程序,第二个是图形界面程序。第一个控制台的程序大约写了十几天,在这期间写完后一直在修改,修改了很多次,但是可能还有一些小的bug,不过不影响游戏。控制台程序目前的版本是2.6.5,这个小游戏我写了四十关。代码大约有一千六百多行,代码我都发到了下面,控制台版本的游戏有两种模式,闯关模式,和选关模式,闯关模式不能跳关,必须一关一关的过,选关模式可以选择任意关卡进行游戏。下面是一些程序运行的截图,控制台版本的代码复制后粘.转载 2020-05-14 13:18:42 · 626 阅读 · 1 评论 -
c++实现职工管理系统
职工管理系统通过c++实现了一个简单的职工管理系统,主要功能如下图:下载链接:原创 2020-05-14 12:11:45 · 421 阅读 · 0 评论 -
c++实现一个简单的通讯录管理系统
通讯录管理系统实现功能如图所示功能相对来说很简单,但是,对于新手来说还是有一定的的参考意义的,如果大家有不懂的地方欢迎给我留言,我会一一为大家解答。代码下载链接:...原创 2020-05-13 09:17:46 · 582 阅读 · 0 评论 -
C++中BitBlt的使用方法详解
BitBlt该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。原型:BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop...转载 2020-05-05 19:52:13 · 3212 阅读 · 0 评论 -
"const char *" 类型的默认实参与 "char *" 类型的形参不匹配问题解决方法
鼠标右键项目选择属性将符合模式改为否转载 2020-04-30 09:01:45 · 1235 阅读 · 0 评论 -
VC++中的char,wchar_t,TCHAR
1、VC++中的char,wchar_t,TCHAR大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱。为了统一,有必要把来龙去脉搞清楚。为了搞清这些函数,就必须理请几种字符类型的写法。char就不用说了,先说一些wchar_t。wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里...转载 2020-04-27 08:05:12 · 833 阅读 · 0 评论 -
kbhit函数(讲解)
函数简介函数名:kbhit()(VC++6.0下为_kbhit())功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0用 法:int kbhit(void);包含头文件: include <conio.h>程序示例 C语言#include<stdio.h>#include<conio.h>intmain...转载 2020-04-21 20:44:09 · 5138 阅读 · 0 评论 -
C++/C++11中std::numeric_limits的使用
在C/C++11中,std::numeric_limits为模板类,在库编译平台提供基础算术类型的极值等属性信息,取代传统C语言,所采用的预处理常数。比较常用的使用是对于给定的基础类型用来判断在当前系统上的最大值、最小值。若使用此类,需包含<limits>头文件。它支持的基础算术类型包括如下:min、max与C库宏常量的关系如下:测试代码如下:#include "nu...转载 2020-04-19 18:46:25 · 955 阅读 · 0 评论 -
C++11中,获取随机数的新方法default_random_engine
C++11中,提供了一种新的获取随机数的方法。以前获取伪随机数都是用的rand,想要获取两个数之间的伪随机数,方法如下:int min,max;//定义上下边界 int range=max-min;//获取中间的范围 int randNum = rand() % range + min;//生成介于min和max之间的伪随机数今天看《C++ Primer 5th Edi...转载 2020-04-17 11:11:35 · 696 阅读 · 0 评论 -
CString、string、string.h的区别
CString:CString是MFC或者ATL中的实现,是MFC里面封装的一个关于字符串处理的功能很强大的类,只有支持MFC的工程才能使用。如在linux上的工程就不能用CString了,只能使用标准C++中的string类了。在MFC中使用不需要自己加,但在另外的程序中需要加入#include<CString>(CString)string:string为标准模板类(ST...转载 2020-04-13 11:04:53 · 394 阅读 · 0 评论 -
C++——cctype
写在前面这篇博客主要来整理一下C++标准库中cctype中的主要函数。之所以要整理这个库,是因为 LeetCode-125. Valid Palindrome,这道题目中,如果知道这个库里的函数,那么就会轻松简单很多。该库主要是字符处理功能,这个头文件声明了一组函数来分类和变换单个字符。这个库中主要有两种函数:一类负责字符分类功能;一类负责字符转换功能。Character classifica...转载 2020-04-12 11:24:29 · 711 阅读 · 0 评论 -
判断一个字符是否为数字的两种方法(C/C++)
判断一个字符是否为数字的两种方法(C/C++)在平时,我们经常遇见判断字符是否为数字这种题目,虽然感觉还是很简单,不过我是个更喜欢用函数的人,因为我觉得这样更便捷,所以我更推荐第二种方式。1.直接判断#include <stdio.h>int main(){ char c; c = getchar();//读取一个字符。 if(c >...转载 2020-04-11 20:44:03 · 3210 阅读 · 0 评论 -
为什么虚函数(virtual)不能是static函数
简而言之,成员函数实例相关,静态函数类相关。虚函数,是一种特殊的成员函数,用来实现运行时多态。 静态成员函数,可以不通过对象来调用,没有隐藏的this指针。 virtual函数一定要通过对象来调用,有隐藏的this指针。所以,关键问题是static成员没有this指针。static function 是静态决议(编译的时候就绑定了)而virtual functio...转载 2020-04-11 16:52:40 · 2088 阅读 · 0 评论 -
勿在头文件中定义static变量
一、问题看到有一位同学在头文件中这么写:static const wchar_t* g_str1 = …static const wchar_t* g_str2 = …这种定义变量的方式我从来没有见过,而且它还能顺利通过编译,于是我很想知道编译器是如何处理这种变量定义的。定义全局变量时使用static,意味着该变量的作用域只限于定义它的源文件中,其它源文件不能访问。既然这种定义...转载 2020-04-11 16:39:01 · 572 阅读 · 0 评论 -
vector容器用法详解
vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。 vector类常用的函数如下所示: 1.构造函数 vector():创建一个空vector vector(int ...转载 2020-04-11 15:49:50 · 475 阅读 · 0 评论 -
C++单例模式:单例模式遇到多线程
单例模式介绍单例模式主要有2中形式,一种是饿汉式,一种是懒汉式。饿汉式:程序一加载单例模式就已经创建了,也就很饥饿嘛。因为是静态属性进行单例初始化,所以优点是线程是安全的,缺点是无论用户是否使用单例对象都会创建单例对象。懒汉式:当用户使用单例对象时,才去创建单例对象,所以很懒惰嘛。优点是用户不使用就不会创建对象,缺点是 当遇到多线程是,是线程不安全的,但是我们可以使用加强版的也就是线程...转载 2020-04-11 15:00:53 · 636 阅读 · 0 评论 -
什么是内存对齐?为什么要内存对齐?
要了解为什么要内存对齐,首先我们要了解什么是内存对齐什么是内存对齐 关于什么是内存对齐,我们先来看几个例子typedef struct { int a; double b; short c;}A;typedef struct { int a; short b; double c;}B;分别对他们求大小,sizeof(A),si...转载 2020-04-10 21:04:02 · 848 阅读 · 0 评论 -
new和malloc的区别
new和malloc的区别是C/C++一道经典的面试题,我也遇到过几次,回答的都不是很好,今天特意整理了一下。0. 属性new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。1. 参数使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。...转载 2020-04-09 20:27:40 · 247 阅读 · 0 评论 -
自增、自减操作符前缀形式与后缀形式的区别
class UPInt{public: UPInt& operator++(); //前缀 const UPInt& operator++(int); //后缀 UPInt& operator--(); const UPInt& operator--(int); UPInt&am...原创 2020-04-09 17:44:31 · 447 阅读 · 0 评论 -
C++中使用placement new
一.newnew operator就是new操作符,不能被重载,假如A是一个类,那么A * a=new A;实际上执行如下3个过程。(1)调用operator new分配内存,operator new (sizeof(A))(2)调用构造函数生成类对象,A::A()(3)返回相应指针事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了...转载 2020-04-09 07:36:19 · 286 阅读 · 0 评论 -
C++ 预处理器
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。我们已经看到,之前所有的实例中都有 #include 指令。这个宏用于把头文件包含到源文件中。C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#l...转载 2020-04-08 18:40:52 · 338 阅读 · 0 评论 -
C++ 模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector 。您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。函数模板模板函数定义的一般...转载 2020-04-08 17:32:52 · 250 阅读 · 0 评论 -
C++ 命名空间
假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。因此,引入了命名空间这个概...转载 2020-04-08 16:55:37 · 206 阅读 · 0 评论 -
C++ 动态内存
了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分:栈:在函数内部声明的所有变量都将占用栈内存。 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时...转载 2020-04-08 16:11:04 · 203 阅读 · 0 评论 -
C++ 异常处理
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。 catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。...转载 2020-04-08 15:54:32 · 300 阅读 · 1 评论 -
C++ 文件和流
到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 ifstream ...转载 2020-04-08 15:44:03 · 256 阅读 · 0 评论 -
#pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置,#pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) 作用:C编译器将按照n个字节对齐。#pragma pack () 作用:取消自定义字节对齐方式。#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新...转载 2020-04-02 09:03:01 · 233 阅读 · 0 评论 -
C++实战——图书管理系统之美
前言: 本文主要实现一个简单的图书管理系统。系统功能结构包括:(1)图书录入模块:该模块主要是提供给图书管理者使用。图书管理者应用该模块将图书信息录 入到系统,系统将图书信息保存到文件中。(2)浏览全部图书记录模块:该模块提供给读者和图书管理者使用。图书管理者可以通过该模块查看图书是否存在,以及获取图书的编号,方便日后的删除;读者可以根据该模块了解到图 书的价格和作者等信息,...转载 2020-03-24 12:47:38 · 678 阅读 · 0 评论 -
sync_with_stdio(), tie()的应用之美
一、sync_with_stdio()这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑在了一起。 在IO之前将stdio接触绑定,可以大大提高IO效率。在操作大数据时,cin,cout的速率也能很快了。现在,我们通过比较解除绑定前后cin,printf的速率来实际体验下sync_with_std...转载 2020-03-24 08:39:59 · 628 阅读 · 0 评论 -
C++实战——飞机大战之美
前言: 最近补习了一下面向对象编程,为了加深自己对类的理解和应用,在网上找了许多小程序的原代码来分析。这两天学习了一位大神写的飞机大战,写的很不错。我把程序分成了三个文件,在头文件"game.h"中声明了数据类型,类类型以及函数;在"game.cpp"中定义了类的数据成员函数和非成员函数;还有一个主函数文件"main.cpp"。一、头文件"game.h" 头文件"g...转载 2020-03-23 07:42:45 · 517 阅读 · 0 评论 -
c++实现2048小游戏之美
简单的2048小游戏,用C/C++完成,控制台程序,没有界面。# include<stdio.h># include<time.h># include<stdlib.h># include<conio.h># include<Windows.h># include<process.h># include<...原创 2020-03-22 20:42:31 · 422 阅读 · 0 评论