
C/C++
零丁若叹
这个作者很懒,什么都没留下…
展开
-
C++使用rapidjson读写json
rapidjson 是一个用于解析和生成 JSON 数据的快速、轻量级的 C++ 库。它提供了一组简单易用的 API,用于解析 JSON 文本并构建 JSON 对象,以及将 JSON 对象转换为字符串形式。原创 2023-06-18 16:24:19 · 1891 阅读 · 0 评论 -
MacOS使用clang
MacOS平台使用clang原创 2022-11-05 19:08:33 · 2382 阅读 · 0 评论 -
fishhook原理
fishhook的使用和原理解析原创 2022-10-29 22:20:40 · 951 阅读 · 0 评论 -
Objective-C和C/C++混合编译
Objective-C和C/C++混合编译原创 2022-10-22 20:03:58 · 2086 阅读 · 0 评论 -
MacOS使用conan
MacOS安装使用conan原创 2022-10-15 18:56:45 · 1967 阅读 · 0 评论 -
MacOS使用CMake
MacOS使用CMake原创 2022-10-08 23:09:18 · 4122 阅读 · 0 评论 -
数组中出现次数超过一半的数字
实现一个函数,找出数组中出现次数超过一半的元素思路:默认第一个元素为找到的元素result,设置times变量为1,遍历数组,如果后面的元素等于result,times加1,如果后面的元素不等于result,times减1,如果times为0,则把result替换为当前元素C++.h#ifndef MoreThanHalf_hpp#define MoreThanHalf_hpp#include <stdio.h>#endif /* MoreThanHalf_hpp */in原创 2022-03-11 23:50:34 · 818 阅读 · 0 评论 -
字符串的排列组合
一个字符串,打印出所有的排列组合,如"abc",所有的排列组合为abc,acb,bac,bca,cba,cab思路: 先确定第一位字符,问题转化为求解后面n-1个字符的排列组合问题,可以使用递归的方式解决。第一位字符可以是字符串中的任何一个字符,所以需要把每一个字符交换到首位,先使用循环,循环里面调用递归函数。C++.h#ifndef Arrangement_h#define Arrangement_h#include <stdio.h>#endif /* Arrangemen原创 2022-03-06 22:55:59 · 520 阅读 · 0 评论 -
层序遍历二叉树
实现一个函数,完成层序遍历二叉树。思路:使用一个队列,保存根结点,先打印根结点的值,把根结点从队列中清除。把根结点的左结点放入到队列中,把根结点的右结点放入队列中,循环进行此过程。C++.h#ifndef TreeAbout_hpp#define TreeAbout_hpp#include <stdio.h>#endif /* TreeAbout_hpp */struct TreeNode{ int val; TreeNode *left; Tre原创 2022-03-05 19:41:54 · 587 阅读 · 0 评论 -
链表的反转
实现一个函数,完成链表的反转思路:1.循环的方式建立两个指针,前面的指针的next指向后面的指针,然后分别移动两个指针,循环到链表结尾2.递归的方式处理head结点的反转使用head->next->next = head,head->next = NULL,然后递归反转剩余的链表部分.hpp文件#ifndef LinkedList_hpp#define LinkedList_hpp#include <stdio.h>#endif /* LinkedList原创 2022-03-05 11:27:24 · 498 阅读 · 0 评论 -
链表倒数第k个结点
实现一个函数,查找链表的倒数第k个结点思路:使用两个指针,第一个指针先指向第k个结点,然后两个指针同时移动,第一个指针移动到末尾的时候,第二个指针刚好位于倒数第k个位置C++.hpp文件//// LinkedList.hpp// CPlusPlusProject////////微信公众号:程序员开发环境#ifndef LinkedList_hpp#define LinkedList_hpp#include <stdio.h>#endif /* Linked原创 2022-03-02 22:37:20 · 257 阅读 · 0 评论 -
数据结构与算法代码选集
1.整形二维数组中,每一行从左到右递增,每一列从上到下递增,判断数组中是否含有该整数。https://blog.youkuaiyun.com/u011608357/article/details/122899737?spm=1001.2014.3001.55022.一个字符串空间足够,把字符串中的每个空格替换成"%20",如"He ll o"替换为"He%20ll%20o"https://blog.youkuaiyun.com/u011608357/article/details/122911005?spm=1001.201原创 2022-02-27 23:54:35 · 296 阅读 · 0 评论 -
移动数组正负数
一个整型数组,包含负数和正数,实现一个函数,把所有的负数挪到数组的左边,所有的正数挪到数组的右边。思路:使用两个指针,分别从数组的两头遍历数组,从左边找到一个负数,从右边找到一个正数,交换这两个数字,循环此过程,知道两个指针相遇。C++.h文件#ifndef PositiveNegative_h#define PositiveNegative_h#include <stdio.h>#endif /* PositiveNegative_h *//* arr为数组,low为数原创 2022-02-27 13:37:38 · 580 阅读 · 0 评论 -
斐波那契数
实现一个函数,输入n,输出第n个斐波那契数思路:可以使用递归和循环的方式分别实现。如果使用的递归,斐波那契数f(n)=f(n-1) + f(n-2)。如果使用循环实现,只要新建变量保存前面两个结果f(n-1)和f(n-2)就可以了。C++.h文件#ifndef FibNumber_h#define FibNumber_h#include <stdio.h>#endif /* FibNumber_h *///n为第几个斐波那契数int fibNumberRecursive(原创 2022-02-26 23:31:40 · 388 阅读 · 0 评论 -
二分查找实现
一个整型有序数组,完成二分查找思路:待查找数字和中间的数字比较,如果比中间的数字小,则在前半段继续查找,如果比中间的数字大,则在后半段继续查找C++.h文件#ifndef BinarySearch_h#define BinarySearch_h#include <stdio.h>#endif /* BinarySearch_hpp *//* arr为待查找数据 low为数组最小的序号 high为数组最大的序号 target为待查找数字 返回值0代表找到,返回值-1原创 2022-02-26 22:13:17 · 321 阅读 · 0 评论 -
快速排序实现
一个整型数组,完成快速排序思路:选取一个元素作为哨兵元素,遍历数组,比哨兵元素小的元素放在左侧,比哨兵元素大的放在右侧,再把哨兵元素放在中间位置,递归此过程。C++代码QuickSort.h文件#ifndef QuickSort_h#define QuickSort_h#include <stdio.h>#include <iostream>#endif /* QuickSort_hpp *//* arr为待排序数组 low为数组最小的序号, high为原创 2022-02-25 23:59:39 · 134 阅读 · 0 评论 -
两个栈实现一个队列
使用两个栈实现一个队列,实现添加方法appendData,实现删除对头元素方法deleteData,实现查看对头元素headData方法思路:栈是现金后出的数据结构,队列是先进先出的数据结构。可以使用第一个栈存入数据实现appendData。需要删除或者查看队头元素时,如果第二个栈为空,把第一个栈的数据存放到第二个栈里面,返回第二个栈的栈顶元素就可以了。如果第二个栈不为空,直接返回第二个栈的栈顶元素。stack.hpp头文件#ifndef StackQueue_hpp#define StackQu原创 2022-02-20 17:26:10 · 429 阅读 · 0 评论 -
链表基本操作
链表是一种基本的数据结构,它由链表结点串联而成,在内存中的存放地址是不连续的。链表结点包含了一个值和指向下一个结点的指针,本篇文章介绍链表的基本操作,包括链表的建立,遍历,查询和删除。#include <iostream>/* arr为数组,length为数组长度 */LinkNode *createLink(int arr[], int length){ if (arr == NULL) { return NULL; } int原创 2022-02-19 23:42:01 · 318 阅读 · 0 评论 -
字符串替换空格
题目:一个字符串空间足够,把字符串中的每个空格替换成"%20",如"He ll o"替换为"He%20ll%20o"思路:先遍历字符串,获得空格的个数,从而获取新字符串的长度。从字符串的尾部遍历字符串,逐个复制字符,遇到空格替换为%20.#include <iostream>void trimBlank(char arr[], int length){ if (arr == NULL || length <= 0) { return; }原创 2022-02-13 16:58:38 · 647 阅读 · 0 评论 -
二维数组查找元素
整形二维数组中,每一行从左到右递增,每一列从上到下递增。判断数组中是否含有该整数。**思路: 从右上角开始查找,带查找的数字如果小于右上角的数,说明要查找的数字不在当前列,列数查找范围缩小,如果大于右上角的数,行数查找范围缩小。C++**#include <iostream>bool findNumber(int arr[][3], int rows, int columns, int num){ if (arr == NULL || rows <= 0 || col原创 2022-02-12 17:46:05 · 817 阅读 · 0 评论 -
C++中的谓词函数
标准库容器定义的操作非常少,标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖容器类型,对不同类型的容器都适用。泛型算法有一组定义在头文件,有一组定义在头文件中。 在泛型算法中,有些算法需要判断容器元素是否满足某个条件,比如判断vector 中的元素能否被2整出,如果用迭代器这个遍历将会比较麻烦,更好的办法是利用谓词函数,谓词函数用于泛型算法中,用于做某原创 2014-01-05 13:45:27 · 3320 阅读 · 0 评论 -
字符串匹配算法
1.普通的字符串匹配算法可以从开始处逐个匹配字符,遇到不相等的情况,可以回溯,从上次的下一个位置开始,继续逐个匹配,下面是程序:# include using namespace std;# include int main(){ int find(string,string ); string s1("hello world "); string s2(" wo原创 2014-02-08 17:31:28 · 986 阅读 · 0 评论 -
C++中的文件读写
文件是具有相同类型的数据类型的任意序列,一般指放在外部介质上的数据集合。C++语言把文件看做是字节的序列,由一个一个的数据顺序组成,根据数据组织的形式,分为ASCII和二进制文件两种,与二进制文件相比,ASCII文件便于输入输出,但占据的存储空间较大,用二进制形式输出数值数据,可以节省空间和转换时间。 使用文件时需要开辟一个缓冲区,从内存向磁盘文件输出数据时,必须先送到内存中缓冲区,缓原创 2014-01-25 19:57:50 · 946 阅读 · 0 评论 -
C++中的友元
C++中的类实现了数据的隐藏,在类中的数据成员一般为私有成员,在访问这些数据的时候,必须通过公有的成员函数来访问私有成员,有时希望用直接的方式访问私有成员,C++中的友元实现了这种机制。 友元可以是友元函数,也可以是友元类,模板也可以定义友元。1 友元类# include using namespace std;class Point{public: friend cl原创 2014-01-29 09:20:20 · 1027 阅读 · 0 评论 -
基数排序
【1】基数排序以前研究的各种排序算法,都是通过比较数据大小的方法对欲排数据序列进行排序整理过程。而基数排序却不再相同,那么,基数排序是采用怎样的策略进行排序的呢?简略概述:基数排序是通过“分配”和“收集”过程来实现排序。而这个思想该如何理解呢?请看以下例子。(1)假设有欲排数据序列如下所示:73 22 93 43 55 14 28 65 39转载 2014-08-27 11:09:24 · 786 阅读 · 0 评论 -
c++迭代器
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。(2) 使用迭代器读取vector中的每一个元素:vector ivec(10,1);for(vector转载 2014-08-16 19:43:15 · 706 阅读 · 0 评论 -
两个有序数组的第n大数
两个有序数组,各自含有n个元素,求第n大的元素1.顺序遍历两个数组,计数变量k统计出现的第k个元素代码如下:int getmid(int a[],int b[],int n){ int k=0; int i=0,j=0; while(i<n&&j<n) { if(a[i]<b[j]) { i++; k++; if(k==n) retu原创 2014-09-01 23:30:19 · 2655 阅读 · 0 评论 -
C++11的一些特性
1.断言是将一个需要为真的表达式放在语句中,在debug模式下检查一些逻辑错误的参数,C++中使用assert需要使用或者头文件。有函数定义如下:voidfun(int a[],int n){assert(n>0);//dosomething;}这样就可以检查n的情况,如果遇到这种情况,程序会调用abort()函数而终止。C++11提供了static_assert断言,原创 2014-10-01 23:28:21 · 1498 阅读 · 0 评论 -
ubuntu编译汇编程序
1. 在ubuntu上编译汇编语言的步骤是先下载nasm安装包,用tar、make等命令安装,然后在vi中建立hello.asm文件,文件内容如下: section .textglobal mainmain:mov eax,4 ; 4号调用mov ebx,1 ; 表示输出mov ecx,msg; 字符串的首地址送入ecx寄原创 2014-02-08 10:23:00 · 10279 阅读 · 0 评论 -
C++ 多重继承
1.多重继承的概念:一个类有两个或者更多个基类形式为 class 类名>:访问属性> class 类名>,访问属性> class 类名>如 class A:public class B,public class C 上面的定义中,如果B和C都有print函数,这时A类的对象调用print函数,将会发生二义性,这是多重继承存在的缺陷,避免这种二义性,可以用域访问符::,如原创 2014-02-06 15:18:20 · 1213 阅读 · 0 评论 -
C++中的函数指针
1.函数指针的定义方式如下:返回类型> (*指针名>) (形参列表>)比如定义了一个函数指针为 int (*p) (int x);p表示一个函数指针,它指向接受一个int型形参的函数,这个函数的返回类型为int .这里要注意的是它不能写成 int *p(int x),这时p不再是函数指针,而是一个函数名,它接受int类型形参,返回类型为指向int类型的指针 如果用原创 2014-01-28 12:06:39 · 1077 阅读 · 0 评论 -
整型溢出
1.当数据超出了类型的最值或者有符号数被解析成无符号数时,可能会发生溢出。整型溢出的形式有:1.存储溢出2.运算溢出3.符号导致的溢出对于存储溢出,加入int m=0x1000;char n=m;printf(“%d\n”,n) 结果会输出0,因为m占据4个字节的存储空间,而n占有一个,m赋值给n时,仅仅把最低字节给了n。对于运算溢出,假如unsignedchar a=255;unsigne原创 2014-04-27 09:02:54 · 4538 阅读 · 0 评论 -
directx 使用环境配置
Direct 开发环境配置1. 安装direct SDK可以在微软官网下载,安装2. 加载配置.h和.lib文件以VC++2010为例,打开VC++2010,选择工具-选项-项目和解决方案-VC++目录,到这一步时可能会遇到“VC++目录编辑已被否决”问题,解决的方法是:选择工具-设置-专家设置,然后点击视图-属性管理器,然后点击项目菜单下的Debug|原创 2014-01-29 17:07:44 · 1593 阅读 · 0 评论 -
C++的内存分类
1.C++中的内存分为五大区域:(1) 栈 存放局部变量,函数形参 调用函数式系统会自动分配一个栈(2) 堆 存放由new存放的内存块,如果没有使用delete及时清理,会造成内存泄露(3) 自由存储区 存放由malloc申请的内存块,(4) 全局变量/静态变量区 存放全局变量静态变量(5) 常量区 存放整原创 2014-04-19 23:00:43 · 969 阅读 · 0 评论 -
C语言可变参数
C语言的函数可以有可变数量的参数,这可以用宏来实现,这个宏定义在stdart.h中。需要用的宏有va_start,va_arg,va_end,还需要用到类型va_list.使用va_list定义一个变量,这个变量用来存放可变参数的列表,va_start从这个列表中读取变量,va_arg用于返回当前的参数值,并且指向下一个可变参数,在可变参数处理完成后,还要调用va_end()。可变参数的实现简原创 2014-03-23 12:54:26 · 1081 阅读 · 0 评论 -
C++自定义异常类
1.C++程序中处理异常或者错误,可以使用异常机制,异常处理的结构为:try{//可能引发异常的代码}catch( type e){//异常处理}catch(…) //省略号代表可以接受任何类型的异常{//}C++抛出的异常可以int、doble、类等类型,抛出的异常要进行处理,否则会自动调用abort(函数终止程序。C++提供了了一些标准的...原创 2014-03-22 22:36:28 · 9044 阅读 · 0 评论 -
C语言条件编译
C语言中的预编译包含三种:1.宏定义2.文件包含3.条件编译,条件编译指的是满足一定条件下才进行编译,它有几种形式:(1) #ifdef 标识符 //程序#else //程序#endif 它的意义为如果定义了标识符,则执行程序段1,否则执行程序段2或者用以下的形式# ifdef 标识符//程序 #endif原创 2014-02-20 13:02:06 · 896 阅读 · 0 评论 -
C++生成调用dll方法
1.VC++2010中新建win32项目,命名为“win32dll”,在应用程序类型中选择dll,在附加选项中选择导出符号,2.Win32dll项目中自动生成的头文件有stdafx.h,targetver.h,win32dll.h,自动生成的源文件有dllmain.cpp,stdafx.cpp,win32dll.cpp在win32dll.h中加入以下函数声明:_de原创 2014-01-29 14:50:30 · 1224 阅读 · 0 评论 -
C++的const操作符
1.C语言中定义一个符号常量可以用宏定义实现如# define MIN 5宏定义的缺陷是仅仅对常量做简单的替换,有时会出现预料之外的结果,如# define MIN(x) x*x 将x设为(2+3)会得到13,而不是25C++中可以用const修饰符来定义常量,const比宏定义常量更加安全。下面的例子展示了宏定义和const的不同,int x=5;# defi原创 2014-01-30 12:02:45 · 1332 阅读 · 0 评论 -
宏与函数
1.宏与函数在定义方式上两者有所不同,宏定义:#define MAX(a,b) ((a)>(b)?(a):(b))函数定义:int max(int a,int b){return a>b?a:b;}宏的名称常为大写,用于与普通函数区分。在一行写不下时,可以用反斜杠隔开,# define MAX(a,b) \((a)>(b)?(a):(b))若想取消宏定义,可以用#und原创 2013-12-26 12:53:15 · 834 阅读 · 0 评论