C++
文章平均质量分 63
C++必知必会,和项目开发实践
吃素的施子
这个作者很懒,什么都没留下…
展开
-
C/C++时间获取函数
包含C/C++中用于获取时间,和时间转换方面的函数。原创 2023-08-14 14:25:45 · 2400 阅读 · 0 评论 -
C++算法题:递归和栈的算法
问题1:跳台阶问题。具体描述,一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间杂度。//相当于从下往上跳,最后剩一个(仅一种跳法)或两个(有两种跳法)+++//函数功能 : 跳台阶问题 //函数参数 : n为台阶个数 //返回值 : 总的跳法 unsigned JumpSteps_Solution1(unsigned n) { if(n <= 2) return n; else原创 2022-05-12 21:14:24 · 884 阅读 · 0 评论 -
C++算法题:关于树的算法
问题1:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。什么是二元查找树?比如:转换成双向链表的顺序是:1 3 4 6 7 8 10 13 14步骤一:建立二叉搜索树struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; };BSTreeNode * Insert(BSTre...原创 2022-05-11 22:12:23 · 840 阅读 · 0 评论 -
C++算法题:什么是红黑树?什么是二叉查找树?
知识体系结构¶ 树树是一种数据结构,它是n(n>=0)个节点的有限集。n=0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。区别于线性表一对一的元素关系,树中的节点是一对多的关系。树具有以下特点:n>0时,根节点是唯一的,不可能存在多个根节点。 每个节点有零个至多个子节点;除了根节点外,每个节点有且仅有一个父节点。根节点没有父节点。¶ 树的遍历按照根节点访问的顺序不同,树的遍历分为以下三种:前序遍历,中序遍历,后序...转载 2022-05-10 22:42:14 · 640 阅读 · 0 评论 -
C++算法题:找环形单链表的环入口
问题1:怎样才能检测到链表中存在循环?书中给出的最终算法是定义两个指针p1,p2,p1每次移动一个位置,而p2每次移动两个位置,这样如果链表中存在循环,那么p2一定能追上p1。如果不存在,那么p2会到达链表尾部,即检测到空//这个算法,并没有找到入口,而是找到了相遇点bool hasCircle(Node* head, Node* &encounter) { Node *fast = head, *slow = head; while(fast &&a原创 2022-05-10 19:44:00 · 471 阅读 · 0 评论 -
C++算法题:关于字符串的算法
问题1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:先逆转整个句子,然后从首字符开始扫描,每扫描到一个单词(遇到空白或结束字符),对这个单词进行逆转。代码:采用左闭右开的形式void Reverse(char *pBegin, char *pEnd) { if(pBegin == pEnd)原创 2022-05-08 21:54:04 · 886 阅读 · 0 评论 -
C++算法题:关于数组的算法
1、问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。适用于严格递增的数组求这个已经旋转过得数组的最小元素//函数功能 : 旋转数组的最小元素 //函数参数 : pArray指向数组,len为数组长度 //返回值 : 最小元素 int FindMin(int *pArray, int len)原创 2022-05-08 21:39:43 · 900 阅读 · 0 评论 -
C++算法题:二分查找和取最大公共子串
二分查找(两种实现方法)/**二分查找思想:1、数组从小到大排序;2、查找的key每次和中间数比较,如果key小于mid查找mid左侧的数组部分;如果key大于mid,则查找mid右侧的数组部分;如果相等,则直接返回mid。输入:排序数组-array,数组大小-aSize,查找值-key返回:返回数组中的相应位置,否则返回-1*///非递归查找int BinarySearch(int *array, int aSize, int key){ if ( array == NULL原创 2022-05-07 20:16:25 · 359 阅读 · 0 评论 -
C++实现几种排序算法
冒泡排序(不断地相邻的比较交换)从小到大排序,比如有5个,先把五个里最小的移到最左边0位置。再把剩下的四个最小的移到1位置......标准的做法是:如果一趟冒泡没有交换,说明顺序已经成型 ,不必再循环 break i 0→ 1→ 2→ 3→ 4→ 5→ 6 j 0 ←1原创 2022-05-07 19:34:41 · 4465 阅读 · 0 评论 -
C++编译时报错 error: unknown type name ‘ ‘
今天项目中,遇到一个很奇怪的问题,明明导入了头文件,却一直说不知道该类型。如类VideoInfo 类存储的是视频 的信息参数,它当作参数,传入 解码器,作为解码器的成员变量,如下:#include <cstdint>#include "IDecode.h" extern "C"{#include "libavformat/avformat.h"#include "libavcodec/avcodec.h"}; class VideoInfo {public: .转载 2021-12-31 17:09:33 · 18647 阅读 · 0 评论 -
C++智能指针详解:shared_ptr
C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。使用 raw pointer 管理动态内存时,经常会遇到这样的问题:忘记delete内存,造成内存泄露。 出现异常时,不会执行delete,造成内存泄露。下面的代码解释了,当一个操作发生异常时,会导致delete不会被执行:void func(){ auto ptr = new Widget;原创 2021-12-19 14:52:26 · 19057 阅读 · 2 评论 -
linux编译动态库时,/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a提示recompile with -fPIC
#g++编译动态库时,使用了ssl的静态库/usr/local/ssl/lib/libcrypto.a,结果一直报上面的错误用openssl0.9.8的的源码重新编译该库,还是报同样的错误,网上搜索了一番,发现正确的编译ssl的流程是./config -fPICmakemake install由于一直用的./config直接配置,没有加后面的参数,所以使用时一直报错。其实报错已经提示了缺少-fPIC,但是一直没仔细研究过加上参数后重新编译ssl库,就可以了...转载 2021-12-19 11:12:42 · 735 阅读 · 0 评论 -
C++智能指针之 auto_ptr和unique_ptr
auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题:1、复制和赋值会改变资源的所有权,不符合人的直觉。2、在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。unique_ptr特性1、拥有它所指向的对象2、 无法进行复制构造,也无法进行复制赋值操作3、保存指原创 2021-12-19 11:00:56 · 311 阅读 · 0 评论 -
gcc/g++ 动态库和静态库,编译与链接(含示例)
程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可执行文件中包含了库代码的一份完整拷贝,缺点是被多次使用就会多份冗余拷贝。还有一种库,就是程序在开始运行后调用库函数时才被载入,这种库独立于现有的程序,其本身不可执行,但包含着程序需要调用的一些函数,这种库称为动态(链接)库(Dynamic Link Library)。..转载 2021-12-09 15:00:05 · 12389 阅读 · 0 评论 -
C++中strcpy()、strncpy()和strcpy_s()区别
1、strcpy() 原型:char *strcpy(char *dst,const char *src) 功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符,返回dst地址。要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,若dst空间不足,编译时并不会报错,但执行时因系统不同会出现不同的结果:Mac系统提示“Abort trap:6”(Mac);CentOS7系统会正常运行(可能是个例,可以正常运行) 测试代码:原创 2021-11-05 16:28:34 · 579 阅读 · 0 评论 -
C/C++信号量CreateSemaphore的用法
创建或打开命名或未命名的信号量对象。要指定对象的访问掩码,请使用CreateSemaphoreEx函数。语法HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName);参数:lpSemaphoreAttribut...转载 2021-11-01 19:07:30 · 2475 阅读 · 0 评论 -
C++字符串拷贝:strncpy()和strncpy_s()区别
在掌握了strcpy函数和strcpy_s函数之后,我们不可避免地会谈到strncpy函数和strncpy_s函数,其实这四个函数的功能几乎一致,就是对两个字符串数组进行复制和赋值,但是具体实现有一点点区别。首先来说一下strncpy函数。该函数依然还是存在于标准名称空间std内,出现的目的很简单,对于strcpy函数,只能将两个字符串进行完整的复制和赋值,这里就会产生一个实际应用时的问题,如果我们只需要复制某个字符串的前几个字符呢?其实对于这个问题,我们首先可能会想到使用strcpy_s函数,因为转载 2021-09-26 18:27:41 · 1216 阅读 · 0 评论 -
C++字符串拷贝:strcpy()和strcpy_s()区别
在编写C++程序时,不可避免会遇到strcpy()函数和其安全版本strcpy_s()函数,其实之所以会推出_s版本的函数,就是为了使编程更加安全,然而为了保证安全,也就会更容易使我们编写的代码“被报错”。所以这里来简略说一下strcpy()函数和strcpy_s()函数的使用及注意事项。首先,我们知道原函数strcpy()函数和安全版本strcpy_s()函数都是存在于头文件<cstring>中的,所以程序一开始必须要有以下语句:#include <cstring>转载 2021-09-26 18:14:09 · 757 阅读 · 0 评论 -
如何用CTP接口开发自己的交易系统?(三)
接到上篇说哈,本文讨论一下数据监听线程和订单管理线程做些什么。一,数据监听线程数据监听线程,当行情处理线程接收到新的行情数据时,也就是每当一个tick到来时,就向数据监听线程发出信号,触发此线程启动,然后依次进行:1.各种指标计算,2.然后进行策略计算,3.最后在满足策略时进行交易。指标计算,就是指根据新到来的数据以及历史数据进行某些统计值的计算,比如常见的MA,MACD,RSI等,当然也可以自己构造出某个统计值。这里需要提到的是数据周期的问题(我在之前的博文中曾解释过)。如果...转载 2021-09-26 10:29:51 · 873 阅读 · 0 评论 -
如何用CTP接口开发自己的交易系统?(二)
本文开始先说说CTP给开发者提供了什么。CTP提供给开发者的文件一共有4个头文件 ThostFtdcTraderApi.h,ThostFtdcMdApi.h,ThostFtdcUserApiStruct.h,ThostFtdcUserApiDataType.h2个dll:thosttraderapi.dll,thostmduserapi.dll(动态链接库,如果是静态库则是thosttraderapi.lib,thostmduserapi.lib)。其中ThostFtdcTraderA...转载 2021-09-26 10:27:30 · 1614 阅读 · 0 评论 -
C++选择编译宏_MSC_VER
_MSC_VER是微软的预编译控制。_MSC_VER可以分解为:MS:Microsoft的简写。C:MSC就是Microsoft的C编译器。VER:Version的简写。_MSC_VER的意思就是:Microsoft的C编译器的版本。微软不同时期,编译器有不同的版本:MS VC++ 14.0 _MSC_VER = 1900 (Visual Studio 2015)MS VC++ 12.0 _MSC_VER = 1800 (VisualStudio 2013)MS VC++原创 2021-09-26 09:35:43 · 782 阅读 · 0 评论 -
Linux程序执行时报:“error while loading shared libraries: xxx.so” 错误解决方法
我们在Linux下执行某些程序的时候可能会提示找不到共享库的错误:"error while loading shared libraries: libprotobuf.so.9: cannot open shared object file: No such file or directory"原因一般有两个:一是:操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对,遇到这种情况那就去网上下载并安装上即可。二是:已经安装了该共享库,但执行需要调用该共享库的程序原创 2021-08-30 10:41:05 · 8613 阅读 · 0 评论 -
C++中 std::vector 的6种初始化方法
1.vector<int> list1; 默认初始化,最常用此时,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。 这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。2.vector<int> list2(list); 或者 vector<int> ilist2 = ilist; //拷贝初始化 ,"="两种方式等价 , list2 初始化为list 的拷贝, list必须与li.原创 2021-08-25 14:22:30 · 38805 阅读 · 0 评论 -
C++使用vector.clear()方法注意事项
void clear():删除存储在vector中的所有元素一、 1.如果vector的元素是一些object,则它将为当前存储的每个元素调用它们各自的析构函数。 2.如果vector存储的是指向对象的指针,此函数并不会调用到对应的析构函数。会造成内存泄漏。想要删除vector中的元素则应遍历vector使用delete,然后再clear for(int i = 0; i < vec.size(); ++i) { delete vec[i]; }原创 2021-08-25 10:36:52 · 9619 阅读 · 0 评论 -
手动实现C++容器vector的clear操作
一,clear问题的引出先约定一下线性表的数据类型:1. typedef int ElemType; //定义数据结构元素的数据类型2. #define LIST_INIT-SIZE 100 //线性表存储空间的初始分配量3. #define LISTINCRENMENT 10 //线性表存储空间的分配增量4. typedef struct{5. ElemType * elem; //存储空...原创 2021-08-24 17:22:10 · 3115 阅读 · 0 评论 -
C++11在linux编译中出现“‘typeof’ was not declared in this scope“ 错误解决
下面这段代码:int main(void){ int a = 10; typeof(a) b = a + 1;}在g++5.4中默认编译可通过,但是若加上c++11选项就编译出错。这是因为typeof是GNU扩展,而不是C++标准。最简单的解决办法是使用gnu++11,而非c++11。g++ a.cpp -std=gnu++11...原创 2021-08-12 16:40:13 · 2887 阅读 · 0 评论 -
Linux实用gdb结合coredump定位崩溃进程
Windows环境崩溃问题可根据vs调试工具查看,Linux同样可以查看调用堆栈的信息,只是需要更改Linux设置,使程序崩溃时候产生core文件。然后gdb调试即可。1、产生core文件方法产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置。ulimit -cunlimited (可以产生coredump且不受大小限制),这种设置仅对当前生效,如果想永久生效那么需要在/etc/profile中加入...原创 2021-08-02 09:16:46 · 1035 阅读 · 0 评论 -
虚幻引擎(UE4)编辑器窗口快捷键整理
在UE4编辑器中,当在视口中操纵actors,如果单独使用鼠标移动,经常会感觉一些精细操作比较困难。实际上,结合UE4提供的快捷键,再配合鼠标操作,进行精细操作其实是可行的。下面是视口操作中所需要的快捷键操作整理。1. 视口基础操作(Viewport Basics)使用ALT键+G/H/J/K键,在透视视口(perspective viewport)/前视口(front viewport)/顶视口(top viewport)/左视口(left viewport)切换。后视口(back viewpor原创 2021-07-24 21:39:21 · 5789 阅读 · 0 评论 -
剖析std::find_if ()的实现方法
最近的项目中标准库函数的使用比较频繁,很多博文都停留在套用层次,我是一个比较爱深究的人,闲暇之余查阅了很多文档。终于找到了满足我好奇心的解释。实际上像std::find_if() std::for_each() 这样的函数就是简单的for循环,为了让我们少些代码而已。让我们一起揭开std::find_if() 神秘面纱。它的定义大致这样的:template<class InputIterator, class UnaryPredicate> InputIterator fin..原创 2021-07-20 20:08:52 · 1247 阅读 · 0 评论 -
量化交易与CTP程序化交易相关文章
http://www.kn2.com/转载 2021-07-15 10:36:39 · 179 阅读 · 0 评论 -
C++ 队列deque的特性和用法
Vector 容器是单向开口的连续内存空间,deque 则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector 容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。deque的操作图示deque 容器和 vector 容器最大的差异,一在于 deque 允许使用常数项时间对头端进行元素的插入和删除操作。二在于 deque 没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链...原创 2021-06-02 19:37:38 · 822 阅读 · 0 评论 -
C语言中:memcpy的正确实现
想必大多数人在面试时被要求写 memcpy的实现,很不幸,我也吃过这个亏(这种题要是写的一塌糊涂后面完全没戏),所以还是得提前准备一下,不然就只能呵呵了。)先来看看一段错误的示范:void * memcpy(void *dest, const void *src, unsigned int count);{ if ((src == NULL) || (dest == NULL)) return; while (count--) *...原创 2021-05-12 16:10:34 · 1004 阅读 · 0 评论 -
VC6.0工程,打开或者添加文件崩溃的解决方法
在Win7操作系统下使用Visual C++ 6.0编程时,如果点击菜单中的【打开】或者【添加】,或者按快捷键,都会弹出下图的对话框,出现程序崩溃并退出的情况。出现这种问题的原因是VC6.0和其他软件冲突所致,网上一般认为是和Office2007或者Office2010冲突,有人说是和Office里的vosio冲突,但是经过检查发现卸载vosio之后问题依旧存在,也有人说是需要重装系统或者重新安装软件,但是这些方法均不可行。其实这是微软的一个bug,微软官方对于这个问题给出了官方的解决方案(原原创 2021-04-09 14:32:18 · 2671 阅读 · 2 评论 -
C++ windows和linux获取当前时间(精确到毫秒)
windows环境下: struct SYSTEMTIME { boost::uint16_t wYear; boost::uint16_t wMonth; boost::uint16_t wDayOfWeek; boost::uint16_t wDay; boost::uint16_t wHour; boost::uint16_...原创 2021-04-09 13:10:30 · 960 阅读 · 0 评论 -
map查找:结构体作为key,为什么只重载“<”就可以了
1)成员函数map.find调用的是等价,也就是!c.key_comp()(x,y)&&!c.key_comp()(y,x),算法find调用的是相等,如find(map.begin(),map.end(),a),调用的是对相等的operator==(2)find其实有两个,一个是算法的find,一个是map成员的find。成员的find是靠“<”,泛型算法的find靠的是"=="。算法的find,类似find(map.begin(),map....原创 2021-03-15 15:08:57 · 686 阅读 · 2 评论 -
期货交易中期货公司和柜台的基础知识
在我们前段时间与市场交流的过程中,发现许多服务于机构用户的业务人员并不是非常了解柜台、主席柜台、次席柜台等概念的释义和其适用场景。所以我们大致整理了下在期货市场中,与程序化交易系统、交易柜台技术开发常用的术语,供大家一起学习、交流。我们先看看程序化交易用户是如何与期货公司、交易所进行信息交互的,然后再逐一拆分会涉及到的概念。交互示意图柜台依据国内监管要求,客户无法直连交易所系统,中间必须经过期货公司(Broker)的系统,这便是柜台系统。期货公司会有多套柜台系统,在功能上可以分为主席原创 2021-02-09 14:13:02 · 2946 阅读 · 0 评论 -
C++编码规范
一、基本准备工作1、设计工程目录结构(1)基本原则:【1】工程本身的文件、项目编译生成的中间文件放一个文件夹;【2】最终生成的目标文件单独放一个文件夹;【3】如果有工程依赖的库文件等单独放一个文件夹;【4】用户代码文件放单独一个文件夹,或者将头文件和源文件单独分开放置;【5】用户代码文件里面如果有比较重要的功能模块单独放一个文件夹,如陀螺仪,气压计,光感,音乐,灯效,图片,字库等。【6】重要的项目资料单独放一个文件夹保存,如硬件原理图,软件框架图,通信协议,复杂重要功能的说明转载 2021-01-11 10:12:35 · 1358 阅读 · 1 评论 -
二叉树的深度优先搜索(DFS)、广度优先搜索(BFS)
1. 基本概念如图所示,BFS为是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。如上图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。2. 基本思路仔细看看层序遍历过程,其实就是从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。所以这里我们借助一个队列进行操作。实现过程首先将二叉树的根节点push到队列中,判断队列不为nullptr,就输出队头的元素, 判断节点如果有孩子,就将孩子push到队列中原创 2020-11-30 15:34:17 · 858 阅读 · 1 评论 -
Linux系统函数readlink;获取链接所指向的位置
函数原型;#include<unistd.h>ssize_t readlink(const char *path, char *buf, size_t bufsiz);函数说明:readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。readlink()会将参数path的符号链接内容存储到参数buf所指的内存空间,返回的内容不是以\000作字符串结尾,但会将字符串的字符数返回,这使得添加\000变得简单。若参数bufsiz小于符号连接的内容长度,过长原创 2020-11-12 18:13:30 · 2141 阅读 · 1 评论 -
c++匿名函数(lambda表达式)的使用方法
1、匿名函数的使用匿名函数的基本语法为://[捕获列表](参数列表)->返回类型{函数体}int main(){ auto Add = [](int a, int b)->int { return a + b; }; std::cout << Add(1, 2) << std::endl; return 0;}上述代码便会输出3,这就是匿名函数的使用方法。注意点:一般情况下,编译器可以自动推断出lambda表达式的返回类型,所以我.原创 2020-11-11 16:09:23 · 1006 阅读 · 0 评论