- 博客(40)
- 资源 (1)
- 收藏
- 关注
原创 日志打印中对容器(包括多级容器)的通用输出
在日志打印中,往往有打印一个数组、集合等容器中的每个元素的需求,这些容器甚至可能嵌套起来,如果每个地方都用for循环打印,将会特别麻烦。基于这种需求,作者尝试实现一个通用的打印函数SeqToStr(),将容器序列化。
2024-06-27 00:32:32
717
原创 减少map/unordered_map查找过程中比较/哈希的次数且用户代码简洁的方法
简化map/unordered_map的find和判断find是否成功,且比count()更高效,对多级map操作更简单
2024-06-25 23:26:49
132
原创 用基于范围的for循环遍历bitset的所有有效位置
标准库中的std::bitset,利用若干个uint32_t或者uint64_t作为存储单元,来表示多个位置的0-1状态,可以节约很多的空间。例如,有31组开关,最少可以只用一个uint32_t来存储这31组开关的状态,只占用4个字节。现在的需求是,对于这31组开关,依次找到其中打开的,做一系列的处理。标准的std::bitset并没有提供遍历的接口。在SGI版本的实现中,std::bitset有_Find_First()和_Find_Next()的接口,可以通过如下代码遍历:std::bit
2021-05-05 23:45:30
2391
2
原创 用位域模拟非字节对齐的整型(uint4_t,int4_t等)
与硬件打交道的时候,会存在不是字节对齐的整型,比如4位无符号整型(uint4_t)、24位有符号整型(int24_t)这种,如果直接用usinguint4_t = uint8_t; using int24_t = int32_t;这种别名的话,虽然也可以用用,但是当值溢出的时候,我们代码是没法发觉的,最终可能使用一个在表示范围外的值。此外当硬件传过来的数如果是一个负数,比如int4_t的-8(0x8),我们用int8_t变量接收的话,用int8_t的方法来解释,必然不是-8,而是8(0x08,符号位为0..
2021-03-21 20:59:11
1706
原创 判断tuple里面是否有某种类型的容器,然后将一个指针或者实体压入这个容器
工作中遇到一个需求,一个模块要处理很多种命令,这些命令定义成了不同的类,其中有些类是“收”命令,有些类是“发”命令。用户定义好命令对象会传给模块,如果是“收”命令,会在一定时间之后,检查传给模块的这个命令对象,看里面的值,收到的东西会写给这个命令对象。所以这些命令,一开始我都在模块内部存成指针,这样一个缺点就是需要保证模块在真正执行这个命令的时候,这个命令没有被析构,不然就成了野指针。这种粗暴情况下,我存命令的容器用一个std::tuple,里面存的是各种命令指针的std::deque,形如:te
2021-01-10 00:05:26
445
1
原创 利用SFINAE+模板函数偏特化,判断一系列类似的枚举是否有某种成员,并写针对这一系列的通用打印函数
SFINEA的概念就是在模板的实例化过程中,如果一种实例方法匹配失败了,不会报错,而是继续寻找其它实例方法。在最近的应用中,我碰到一个需要打印枚举的需求,打印枚举,一般的实现就是在打印枚举的函数里面写一个局部静态的哈希表(std::unordered_map),把枚举值和要输出的字符串一一对应。类似于这种: static const char* Enum2Str(Format content) { static auto && enum_map = []()
2020-12-13 01:35:42
410
原创 模板函数的偏特化探索
有一个生成坐标的函数,这个函数会受5个参数的影响,导致具体的实现有所不同,其中某些组合下的实现相同,为了让那个判断的函数简短一点,就想到用模板来做,并且会出现模板函数的全特化和偏特化的情况。但是C++目前的标准不允许模板函数存在偏特化,只允许模板类存在偏特化。我这五个变量都不是类型参数,而是值参数。由于不允许结构体作为模板的参数:我就想,能不能用常量表达式+联合体的方式,把一个结构体转换成整型?于是就动手写了一下。用联合体实现一个U16(unsigned short)和一个16
2020-12-09 20:48:49
363
原创 为什么modern C++中默认构造函数也最好加一对空的花括号?
C++11开始,变量的初始化除了=等号号还能用初始化列表{},其中在 Effective Modern C++ 中,作者还强调初始化列表可以解决以前的一个很恼火的问题,就是如果调用默认构造函数,不能在后面加空的括号,因为这会被解释成函数的声明:Widget w1; //默认构造函数Widget w2();//声明一个返回值为Widget类型、不接受参数的函数w2Widget w3{};//默认构造函数看到这里我就产生了疑惑:不加括号不就完了吗,同样也是调用默认构造函数呀?话是这么说,但我还是照着
2020-06-01 21:34:37
888
原创 不推公式不用证明不断链,求单链表中环的入口结点
首先看另一道题:AB两条无环单链表,求A、B的第一个交点,没有则返回null。这道题可以根据加法交换律来做,也就是分别用两个指针p1、p2遍历A和B,当到达链表末尾的时候,转向另一条链表的头结点,那么如果换头后p1和p2第一次相等了,就到达了A、B的第一个交点(或者null)。为什么呢?因为,所以当p1、p2都换头之后,他们必定会同时到达链表末尾,那么他们与各自所在链表末尾的距离...
2020-01-02 12:49:59
141
1
原创 利用python批量合并手机哔哩哔哩下载的视频各分段
从手机哔哩哔哩上下载的一个电视剧,分为很多P,每一P里面又被分成了如下几个段的blv文件(本质上是flv格式),利用Python+ffmpeg,将这个系列的视频每一P都合并成单个的文件,只要输入这个视频的根目录地址即可整个代码只需修改videoPath即视频的根文件夹路径即可通用,注意将ffmpeg.exe所在的文件夹路径添加到环境变量“path”中。详细内容在注释里注明了。impo...
2019-10-06 20:33:07
1254
原创 用python代码去掉CPP代码中的注释
最近的作业,第一次正儿八经地使用python。主要思路是,将能干扰注释符号的内容(CPP里就是字符串了)列举出来,一共有“"”“//”和“/*”,在一段文本中,这三个符号谁先出现,则谁的优先级高,直到他们的结束符“"”“\n”和“*/”出现,这中间的内容不需要管。get1stSymPos就是做这么一件事然后核心函数rmCommentsInCFile就是从0到字符串结尾,开始找最先出现的符号,如...
2018-12-31 20:09:40
2230
原创 含有虚函数的struct(class)内存对齐和空间大小的计算(win32)
考虑这样一个类b,依次包含一个虚指针、char、类a、int、double数组struct a { char c;//1+7 double d;//8};//16struct b { char c; a s; int i; double d[3]; virtual ~b() {}}; 按照道理来讲,虚指针vptr占用4字节,...
2018-09-10 18:27:32
1202
原创 由所给长度相同的单词,按位组合出字典序最小的新单词
一道笔试编程题,想出一个时空复杂度O(N*L)的方法,不知道有没有更快的 。题目描述:现给出N个长度为L的单词。单词中仅包含大写英文字母(A-Z)。1<=N<=20001<=L<=10你可以从这些单词中的第n个字母中挑一个作为你拼词的第n个字母比如给出N=3个L=4的单词:CAKETORNSHOW你可以(但不仅限于)拼出以下单词:C...
2018-08-30 21:53:34
846
原创 华为笔试,语法树,用单行的类LISP语法字符串表示
有数字(0~9构成的正整数)、三种操作运算符(加法+、乘法*、自增^)、分隔符一个空格、左右括号表达式形式是“(运算符 参数)”形式比如(+ 3 4),求值结果7;(+ (* 2 3)(^4))求值结果11语法树结束后,后面加任何字符都是合法的,比如(+ (* 2 3)(^4)))))))#$是合法的匆匆忙忙地写了一个,感觉太长了。。。应该有很大的优化空间。主要思路:用一个va...
2018-08-15 22:18:06
946
原创 std::vector删除元素迭代器以及内存的变化
std::vector是顺序容器,当用erase成员函数删除一个迭代器指向的元素时,会自动移动(不是std::move)后面的元素到前面来,而迭代器的指向不变(如果是std::map、std::list这类关联型容器,迭代器会失效),并且不会回收内存(也就是capacity不会变)。当用swap成员函数跟自身的拷贝交换时,才能释放多余内存。代码如下,自定义一个foo类以监视构造、赋值、复制、...
2018-08-09 11:31:51
3492
原创 生产者消费者问题 C++解决方法
抄自维基百科 :生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消...
2018-08-05 17:22:28
3071
原创 C++ STL中的 emplace
英文释义(以前还真的很少用到这个单词,但是经常在键入empty()函数的时候冒出来):emplace 英 [ɪm'pleɪs] 美 [ɪm'pleɪs] v. 放列,安置,安放;相对于insert、push、push_back系列先构造临时变量再复制到目标位置,emplace直接在目标位置上构造了。而且emplace支持“变参模板”,也就是说,如果它的实例类的构造函数有多个参...
2018-08-03 11:09:21
1003
转载 C++11 标准新特性:Defaulted 和 Deleted 函数
Defaulted 函数背景问题C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。例如:清单 1 1 2 3 ...
2018-08-01 09:41:50
157
原创 阿里在线编程测验题
2018年7月17日,阿里在线编程测验,题干如下,它最后面的两条注释应该有说反了依赖关系。今天我们看到的阿里巴巴提供的任何一项服务后边都有着无数子系统和组件的支撑,子系统之间也互相依赖关联,其中任意一个环节出现问题都可能对上游链路产生影响。小明做为新人接收到的第一个任务就是去梳理所有的依赖关系,小明和每个系统的负责人确认了依赖关系,记录下调用对应系统的耗时,用这些数据分析端到端链路的...
2018-07-17 23:57:10
3521
2
原创 多线程问题,实现三个线程顺序循环输出123123123...
阿里中间件笔试题记录:有三个worker线程:worker1、worker2、worker3。三个线程分别只能输出1、2、3。请写出代码,实现三个线程顺序循环输出123123123...#include <iostream>#include <thread>//thread#include <condition_variable>//cond...
2018-07-10 20:31:17
2472
原创 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
//自写乘法class Solution{public: //利用ab = a/2·2b的性质 int multi(int a, int b){ int res = 0; (a&1) && (res += b);//如果a是奇数,那么除以2之后,再乘以2,会少1,所以在res上先补1个b a >>...
2018-06-21 16:37:54
464
原创 和为S的连续正数序列
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck! 输出描述:输出所有...
2018-06-16 21:12:01
374
原创 安卓手机当做电脑摄像头使用,Android 8.0 + Win10亲测可用
台式机没有摄像头,做笔试题目又需要摄像头,懒得把笔记本带过来,就想找找有没有这种方法,网上的不知道为什么,都是五六年前的链接,都不支持安卓8.0和Win10。自己找到一个,分享一下。 PC版和安卓版软件官网地址,安卓版也可以Google Play 搜索DroidCam,或者网盘下载。 装了就行,手机上是这样:电脑上是这样:可以局域网下WiFi连接或者用U...
2018-06-16 14:05:51
234780
41
转载 成员指针运算符 .* 和 ->*
指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。C++的成员指针遵从同样的原则。困难的是所有的指针需要一个地址,但在类内部没有地址;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时逆向引用成员指针。struct simple { int a ; }simple so;simple*...
2018-06-14 17:24:56
3198
原创 两个单链表的第一个公共结点
方法1:由于是单链表,所以可以用一个set保存第一个的节点,然后遍历第二个链表,寻找相同的节点,时间复杂度O(MlogM),空间复杂度O(max(M,N)),代码 ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { //最先想到的办法,空间复杂度O(M),时间复杂度O(max(M,N)) ...
2018-06-06 21:05:32
2321
原创 无法用 "ATTRIB_GEN_STRING *" 类型的值初始化 "ATTRIB_GEN_NAME *&" 类型的引用(非常量限定)
在ACIS中,很多下行强制(downcast)转换是安全的,如对一个ENTITY*指针强制使用(BODY*)从来没有出现过问题。 今天碰到的是api_find_named_attribute这个函数,原型如下。 DECL_GA outcome api_find_named_attribute( ENTITY* ent, con...
2018-06-04 11:13:02
3483
1
原创 虚基类、虚拟继承、虚函数?
前几天师兄想考我什么是虚基类的时候,我说是因为多重继承中,如果出现菱形继承(multiple inheritance diamond),不想要末端派生类有两份最底层基类的数据的话,就得用虚拟继承。结果居然被怼了,说我说的啥玩意儿?我还以为我记错了,实际上是他把虚基类和含有虚拟函数的基类给混淆了。 今天读了Effective CPP,再总结一下虚基类把,就是被虚拟继承的基类。虚拟继承很少用到,...
2018-06-03 21:12:19
704
原创 因丑数问题联想到的STL迭代器失效问题·vector
今天写一个丑数的程序,一开始用的迭代器表示位置,写出了这个int GetUglyNumber_Solution(int index) { if (index <= 0) return 0;//返回错误信息 vector<int> uglyNums; uglyNums.push_back(1); //定义三个迭代器Tx,分别表示第一个乘以x后大于当前最大丑数的元素的...
2018-06-01 10:12:24
134
原创 error LNK2019的一种原因
1>Link:1> 正在创建库 d:\documents\visual studio 2010\Projects\testDLL\Debug\testDLL.lib 和对象 d:\documents\visual studio 2010\Projects\testDLL\Debug\testDLL.exp1>cal.obj : error LNK2019: 无法解析的外部...
2018-05-23 22:10:38
2885
原创 关于C++内存泄漏的一些简单理解
关于类的自定义赋值运算符和复制构造函数的重要性。反面例子:class a{//没有自定义的复制构造函数和赋值运算符public: a(int num=0){ ptr = new int(num); } ~a(){ delete ptr; }private: int *ptr;};void doNothing(a dummy){}//值传递对象的危害int main(){ a x...
2018-05-15 09:51:20
177
原创 一个不容易混淆的方法区分诸如const int * 、int const *和int * const
参考这位的说法,具体代码 const int a = 1; int const b = 2;//&a 和 &b 是const int * 类型 a = 1;//错误 b = 1;//错误 const int * p1 = &a; int const * p2 = &a;//p1,p2不报错,说明两者等价 int * const p3 = &a;/...
2018-05-14 10:18:24
258
原创 char* x = new char[length]的问题
length 是字符长度,如"666"长度为3,但是直接new char[3],然后sprintf把666存进去,在delete[]的时候会卡住,new char[3+1]才行。char*类型经常容易忽略'\0'的存在 unsigned length = 0; int temp = i+1; while(temp != 0){ temp/=10; ++length; }...
2018-05-09 10:18:32
5395
原创 ACIS中,复制一个ENTITY*变量只能用api_copy_entity(),不能用ENTITY的复制构造函数
从文件中读入一个sat文件到ENTITY_LIST list中,并用ENTITY* 对象copy复制若干份,方法1复制的对象,存在很多问题,虽然可以用api_find_named_attribute读取copy里面的内容,用api_remove_generic_named_attribute删除里面的内容,但是api_add_generic_named_attribute无效,而且...
2018-04-24 20:13:13
411
原创 ACIS 建立椭球体
ACIS没有专门的椭球函数,采用scale_transf函数来实现,以为例,先建立原点为圆心,x轴长为的直径正圆体,再沿y、z方向拉伸,最后将椭球移到球心(5,4,6) BODY* sphere1; api_solid_sphere(SPAposition(0,0,0),8,sphere1);//x轴长为直径 api_transform_entity(sphe...
2018-04-20 15:31:22
467
原创 Qt中使用QAxObject的dynamicCall和querySubObject函数操作SolidWorks的方法
大部分函数可以直接从VB语言“翻译”过去成为Qt中的C++语言,如 Set Part = swApp.OpenDoc6(strFilePath & "\" & partName & ".SLDPRT", 1, 0, "", longstatus, longwarnings) '打开指定文件,这里是SLDPRT格式三维模型 Set Part ...
2017-11-10 16:15:09
20879
8
原创 Qt Qsyntaxhighlighter给QTextEdit设置丰富的语法高亮格式
根据我自己的要求,设置了一个语法高亮格式.关键字和函数从文件抓取,全局变量是一个动态的文件流,随着软件的运行会变//头文件#ifndef MYSYNTAXHIGHLIGHTER_H#define MYSYNTAXHIGHLIGHTER_H#include #include //#include #include #include //#include //#include
2017-07-03 14:42:21
4892
原创 【笔记】QT正则表达式要注意的东西
可能是转义字符再次转义的问题,也有可能是QString再次使用会自己添加一对双引号的问题,反正这样用就没问题了。QString global_operator::decode_nodes(QString node_text){ qDebug()<<"来了吗?"; node_text = remove_comments(node_text); //似乎不能赋值
2017-06-28 11:24:58
336
原创 将一个程序中的cout获取出来生成日志文件
在QT里面写程序,还调用了另一个dll,这个dll里面有很多有用的标准输出cout,但是只能在QT的“应用程序输出”那栏显示。如果发布软件,脱离QT后,这些信息就看不到了,不利于用户诊断。所以找到一个方法脱离QT也能显示。就是QProcess。
2017-06-23 16:25:58
709
DroidCam谷歌Play版6.7.1
2018-06-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人