
C++基础
文章平均质量分 50
C++基础
东城青年
非宁静无以致远
微信号:15221816820
展开
-
栈与队列详解
数组与链表是数据存储的基本方法。成员访问中,数组可以随机的访问成员,链表通过遍历可以去找到需要的数据单元。栈与队列是两种特殊的数据成员管理方式。它们本身的数据存放方式也是数组或者链表。栈:FILO(先进后出)。只允许在栈顶添加元素和删除元素(出栈和入栈) 队列:FIFO(先进先出)。在队首删除元素,在队尾添加元素(出队和入队)判断什么时候栈为空栈底加一个特殊标记 记录栈底的...原创 2019-03-17 13:16:39 · 430 阅读 · 0 评论 -
Git使用教程:最详细、最傻瓜、最浅显、真正手把手教
第二种是git reset --hard 版本号。首先要明确下,所有版本控制系统,只能跟踪文本文件的改动,比如txt文件,html网页,所有程序的代码等,Git也不例外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽然也能由版本控制管理,但没法跟踪问价的变化,只能把二进制位见每次改动串联起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。比如自己在电脑上修改了A文件,其它人在电脑上改了B文件,这是,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。原创 2024-05-23 18:16:05 · 1033 阅读 · 0 评论 -
算法的时间与空间复杂度
算法是指用来操作数据、解决程序问题的一种方法。对于同一问题,使用不同的算法,也许最终结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那我们该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的【时间】和【空间】两个维度去考量。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是鱼和熊掌不可兼得,那我们就需要从从中去取一个平衡点。下面我来分别介绍一下【时间复杂度】和【空间复杂度】的计算方式。原创 2024-05-22 15:36:53 · 718 阅读 · 0 评论 -
Windows程序崩溃定位
Windows程序crash定位,首先需要有dump文件,dump文件是C++程序发生异常时,保存当时程序运行状态的文件, 是调试异常程序重要的方法。windows系统默认不产生程序的dmp文件,需要手动设置才能生成dmp文件。原创 2024-04-28 18:17:55 · 1975 阅读 · 0 评论 -
静态链接lib库使用
lib库实际上分为两种,一种是,另一种叫做。这两个库是不一样的,很多人都分不清楚,很容易混淆。原创 2024-04-26 18:36:07 · 385 阅读 · 0 评论 -
c++统计函数耗时
QueryPerformanceCounter 是系统性能统计计数器,表示统计了多少次,除以QueryPerformanceFrequency,得到系统运行时间(秒数)。作用:该函数是操作系统的性能统计分辨率,也就是每秒钟统计多少次的意思,返回硬件支持的高精度计数器的频率。返回非零,硬件支持高精度计数器,返回零,硬件不支持,读取失败。原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);原创 2024-04-24 13:49:01 · 365 阅读 · 0 评论 -
windows截图
【代码】windows截图。原创 2024-04-23 18:06:10 · 329 阅读 · 0 评论 -
c++调python接口
2. 将run.py文件拷入c++工程目录下:项目->属性->VC++目录->包含目录->添加python头文件路径(C:\Python38\include); 链接器->常规->附加库目录->添加python库路径(C:\Python38\libs); 链接器->输入->输入python38.lib;2.1 c++中直接运行python代码 在dllmain.cpp中添加如下接口:新建utils.h文件:生成解决方案,生成lib和dll文件,将util.h原创 2024-04-10 18:45:35 · 1091 阅读 · 0 评论 -
C语言多线程基础(pthread)
由于我们没有在主线程中等待我们创建出来的10个线程执行完毕,所以创建出来的子线程可能还没来得及执行,就因为主线程(main函数)执行完毕而终止整个进程,导致子线程没法运行。而且传的是地址,子线程在执行时,i值可能还没更新,所以可能会打印重复的值。但是线程执行的顺序是不固定的,也就是说我们无法预知打印的顺序。根据代码判断程序的输出是不可行的,我们只知道输出的内容,但不知道输出的顺序。使用pthread_join()除了有阻塞线程功能之外,还可以利用其第二个参数,得到线程函数的返回值。原创 2024-01-12 17:53:18 · 2369 阅读 · 0 评论 -
指针函数与函数指针
/将fun()函数首地址传给指针变量fp。//fun是指针函数;指针函数:指针函数是一个函数,返回值是一个指针。函数指针是指向函数的指针变量,本质是一个指针。//fun是指针变量。格式: 返回值类型 (*函数名) (参数)原创 2023-07-06 20:43:02 · 273 阅读 · 0 评论 -
sizeof(数组名)与sizeof(指针)
sizeof(指针) :返回计算机系统的地址字节数,如果是32位系统,返回4,64位系统返回8。注:buf2是指针数组,数组的元素是指针,所以sizeof(buf2[1])返回值是4。结果:4,对于“”中的字符串,默认后面还有一个\0,所以实际的长度要+1.验证:printf("%d\n",sizeof("123"));sizeof(数组名):返回数组所有元素占有的内存空间字节数。sizeof("XXXXX")应该是多少呢?原创 2023-07-06 20:07:18 · 306 阅读 · 0 评论 -
指针的指针理解与用法
指针实际上就是一个变量,当他不是空指针的时候他的值就是某一个地址,同时他自己也是有地址的,因为它是一个变量。指针的指针的值其实就是某一个指针的地址。原创 2023-07-06 20:28:03 · 312 阅读 · 0 评论 -
指针地址与指针指向的地址
int *q = new int[3];q表示指针指向的地址,&q表示指针本身的地址。int main(){ int ret = 0; int *a = new int[3]; int *c = new int[4]; int *b = a; printf("%6x %6x %6x %6x\n", &a, a, &b, b); delete a; delete c; printf("%6x %6x %6x %6x\n", &a, a, &a原创 2022-05-15 16:10:52 · 3184 阅读 · 1 评论 -
正负数在内存中都是以补码的形式存储
正数:原码、反码、补码一致;负数:原码最高位为符号位,0为正数,1为负数;除掉符号位取反得到反码;反码加1得到补码;打断点调试: 调试->窗口->内存十六进制81的二进制表示为10000001,事实证明,计算机中负数是以反码存储的,由此可推广,计算机里所有数都是以反码形式存储的。...原创 2022-05-19 23:44:19 · 3149 阅读 · 3 评论 -
c++综合学习
一个数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也以存储在某个函数指针变量中。使用场景(用来修饰形参,防止误操作): 加上const在函数体里就不能对v进行修改了,如果不加const,函数体里面对v修改了,则函数外相应也会被修改;stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。stream--这是指向FILE对象的指针,该FILE对象标识了流。原创 2023-05-22 19:39:24 · 588 阅读 · 0 评论 -
c和c++混合编程
c程序中用到c++文件时,在c++头文件中加入条件编译,如下:原创 2022-05-22 11:26:09 · 267 阅读 · 0 评论 -
c++读取wav文件
【代码】c++读取wav文件。原创 2023-03-28 15:56:46 · 2200 阅读 · 2 评论 -
保存raw文件
保存raw文件原创 2022-12-27 10:34:37 · 447 阅读 · 1 评论 -
bin文件参数读入结构体
3. 按行读取txt文件,通过字符串分割将目标去除保存到新的txt文件;4. 将纯净版txt文件保存成bin文件;6. 打印结构体中各成员变量接收到的参数;0xcc(该地址没申请,默认值为cc)1. 定义接收参数的结构体结构及变量;5. 将bin文件读入到结构体指针;2. 配置参数配置文件txt文件;原创 2023-07-20 16:47:18 · 387 阅读 · 0 评论 -
bin文件读写
bin文件读写转载 2022-08-09 20:58:08 · 2601 阅读 · 1 评论 -
C语言读写txt文件
1.从txt文件中按指定格式 读出:int read_raw_hex_data(const char* path,int data_length ,int* a) { FILE* fpRead = NULL; int ret = 0; int i = 0; fopen_s(&fpRead, path, "r"); if (fpRead == NULL) { printf("Fail to read raw data file!"); ret = -1; return r原创 2022-04-19 18:01:04 · 22805 阅读 · 0 评论 -
snprintf函数的用法
int snprintf(char *str, size_t size, const char *format, ...) 设将可变参数(...)按照 format 格式化成字符串,并将字符串复制到 str 中,size 为要写入的字符的最大数目,超过 size 会被截断。 char buff[50]; char wbuff[3]; wbuff[0] = 0x01; wbuff[1] = 0x01; wbuff[2] = 0x00; snprintf(buff, 256, "原创 2022-01-21 16:48:27 · 875 阅读 · 0 评论 -
c语言fopen读数据,fprintf写数据
//data是一个用来存放数据的数组, file_name为文件名void read_data(float data[], char file_name[]){ FILE *fp; if (!(fp = fopen(file_name, "r"))) { printf("Cannot open file. "); } int i = 0; float temp = 0; while ((fscanf(fp, "%f", &temp)) != EOF) //以浮点型格式.原创 2020-10-29 20:59:15 · 1709 阅读 · 1 评论 -
DLL的封装及调用
DLL封装1.新建Win32项目2.新建function.h头文件注意:其中__declspec(dllexport)代表导出dll; 为了在生成dll的过程中函数名不发生改变方便后面dll的显示调用,需要在前面加上extern "C"; dll封装类,为了后面dll的显示调用能调到类中的方法,需要在类中方法名前加上virtual;如果后面采用dll的隐式调用,则正常声明即可,因为lib文件中会生成相应的函数名和入口地址。#define CREATDLL_EXPORTS#原创 2022-04-21 12:11:51 · 3408 阅读 · 0 评论 -
大小端模式
大端模式:数据的高字节保存在内存低地址中;小端模式:数据低字节保存在内存地址中;计算机中常用的是小端模式。int showbytes(char* bytep, int len) { for (int i = 0; i < len; i++) { printf("%.2x\n", bytep[i]); } return 0;}int main(){ int ret = 0; int x = 0x01234567; showbytes((char*)(&a原创 2022-01-21 14:19:25 · 124 阅读 · 0 评论 -
MFC 读取文件及CString字符串分割
MFC读取文件: // 输出数据 ofstream output_file; output_file.open("***************************8.txt"); // 读取数据 CStdioFile file; file.Open(_T("test.txt"), CFile::modeRead); CString strVal = _T(""); int data = 0; while (file.ReadString(strVa原创 2021-08-11 16:47:55 · 1683 阅读 · 0 评论 -
基于ncnn框架搭建MTCNN人脸检测工程
1、下载git2、在桌面新建文件夹test,进入该文件夹,鼠标右击选择Git Bash Here3、在弹出的命令行窗口中输入以下指令,将该仓从github上下载下来git clonehttps://github.com/moli232777144/mtcnn_ncnn.git4、继续输入以下指令更新子模块git submodule update --init5、双击t...原创 2019-06-10 20:33:09 · 2060 阅读 · 1 评论 -
求数组最大值最小值
#include <iostream>#include <algorithm>using namespace std;int main(){ int *max_val, *min_val; int a[5] = { 2, 32, 16, 8, 52 }; max_val = max_element(a, a + 5); min_val = min_element(a, a + 5); cout << "max_index = "<&.原创 2021-09-18 11:50:42 · 276 阅读 · 0 评论 -
返回二维数组
#include "iostream"#include "stdio.h"#include "stdlib.h"using namespace std;//c++中函数不能直接返回一个二维数组//当需要函数的返回值为一个二维数组,可采用typedeftypedef int(*R)[3];R transpose(int arr[][3], int rows, int cols) //不能写成int ** transpose(int **a ,int...){ for (int i = .原创 2022-05-06 23:07:54 · 1217 阅读 · 1 评论 -
size_t和int区别
size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。在32位架构中被普遍定义为:typedef unsigned int size_t;而在64位架构中被定义为:typedef unsigned long size_t;size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构...转载 2019-09-05 11:07:00 · 439 阅读 · 0 评论 -
c++读取文件夹下所有文件
getFiles(“文件夹路径”,返回该文件夹下所有文件的绝对路径)#include<iostream>#include <string> #include <io.h> #include <vector> using namespace std;void getFiles(const std::string & ...原创 2019-06-22 18:29:38 · 7242 阅读 · 0 评论 -
模板(template)使用介绍
我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数类型的不同及所属类的不同,正确的调用重载函数。例如,为求两个数的最大值,我们定义max()函数需要对不同的数据类型分别定义不同重载(Overload)版本。但如果在主函数中,我们分别定义了char a,b;那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。现在,我们...原创 2019-03-31 17:53:00 · 19875 阅读 · 0 评论 -
命名空间
假设这样一种情况,当一个班上有两个叫Jack的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等。同样的情况也出现在C++应用程序中。例如您可能会写一个名为abc()的函数,在另一个可用的库中也存在一个相同的函数abc()。这样编译器就无法判断您所使用的是哪一个abc()函数。因此,引入了命名空间这个概念,专门用于解决上面的问题...原创 2019-03-27 10:52:47 · 245 阅读 · 0 评论 -
文件和流
到目前为止,我们已经使用了iostream标准库,它提供了cin和cout方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库fstream,它定义了三个新的数据类型:打开文件在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream和fstream对象都可以用来打开文件进行...原创 2019-03-27 10:19:46 · 163 阅读 · 0 评论 -
接口(抽象类)
接口描述了类的行为和功能,而不需要完成类的特定实现。C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用“=0”来指定的,如下所示:class Box{ public: virtual double getVolume...原创 2019-03-26 19:25:15 · 139 阅读 · 0 评论 -
数据抽象
数据抽象是指,只向外接提供关键信息,并隐藏其后天的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程技术。让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量等,但是您不知道它的内部实现细节,也就是说,您并不知道它是如何通过缆线接收信号,如何转换信号,并最终显示在屏幕上。因此,我们可以说电视把它的内部实现和外部接口分离开了,...原创 2019-03-26 18:40:23 · 689 阅读 · 0 评论 -
多态
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是继承关系时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类 Shape 被派生为两个类,如下所示:#include <iostream> using namespace std; class Shape { protected: ...原创 2019-03-26 14:32:15 · 136 阅读 · 0 评论 -
重载运算符和重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。函数重载...原创 2019-03-26 13:42:51 · 321 阅读 · 0 评论 -
继承
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据一个类来定义另一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。基类 & 派生类一个类可以派生自多个类,这意味着,它可以从多个基类...原创 2019-03-25 19:20:02 · 177 阅读 · 0 评论 -
类的静态成员
类的静态成员类的静态成员和静态成员函数即使在类对象不存在的情况下也能被调用,只要使用类名加范围解析运算符::就可以访问。我们可以使用static关键字来把类成员定义为 静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符::来...原创 2019-03-25 18:46:29 · 250 阅读 · 0 评论