- 博客(97)
- 资源 (4)
- 收藏
- 关注
原创 gflags用法之RegisterFlagValidator
gflags的应用场景非常多,其中一个非常有用的方法是RegisterFlagValidator,在gflags发生修改时,会执行所注册的函数,通过这个函数可以实现参数校验以及各种有意思功能,比如重新初始化一些信息之类的,实现快速热加载的功能。原文参见:gflags/gflags.h.in at master · gflags/gflags · GitHubhttps://github.com/gflags/gflags/blob/master/src/gflags.h.in// -------.
2021-12-12 20:42:03
896
原创 C++模板--基础篇
动机:模板的存在是为了消除重复代码,提高代码复用率的。方案:根据给定类型生成所需函数。函数模板函数模板是C++模板机制中的yi
2020-02-29 15:03:16
522
原创 【C++17】新特性梳理
按照推荐度排序if init表达式C++17语言引入了一个新版本的if/switch语句形式,if (init; condition)和switch (init; condition),即可以在if和switch语句中直接对声明变量并初始化,如下:if (auto val = getValue(); condition(val)) { // some codes if is ...
2020-02-16 11:02:37
867
原创 移动语义move性能测试
动机:减少非必要的拷贝实现思路:1、必须要语法让我们在调用端告诉编译器,这是个Rvalue std::move可以实现2、必须有语法让我们在被调用端写出一个专门处理Rvalue的函数,参考std::string的实现std::move 将实参强制转换成了右值测试代码:void test_move() { for(int j = 13; j < 20; ++...
2019-12-28 14:38:27
657
1
原创 C++11 多线程编程--线程安全队列
1 std::thread类的构造函数是使用可变参数模板实现的,也就是说,可以传递任意个参数,第一个参数是线程的入口函数(可调用对象),而后面的若干个参数是该函数的参数。2 std::mutex有两种操作:锁定(lock)与解锁(unlock)。3 std::lock_guard在类的构造函数中创建资源,在析构函数中释放资源,因为就算发生了异常,c++也能保证类的析构函数能够执行。4 ...
2019-08-18 21:41:10
1425
原创 C++11 std::function和std::bind
1 可调用对象不同类型可能有相同的调用形式,如:// 普通函数int add(int a, int b) { return a + b; }// lambda表达式auto mod = [](int a, int b) { return a % b; };// 函数对象类struct divide { int operator()(int denominator, int...
2019-06-04 00:26:20
763
原创 Bridge桥模式
“单一职责”模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同事充斥着重复代码,这时候的关键是划分责任。动机由于某些类型的固有的实现逻辑,使得它们具有两个纬度的变化,乃至多个纬度的变化。如何应对这种"多维度的变化"?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?处理多维度变化的场景...
2019-05-02 23:32:40
1206
原创 使用Flask搭建简单的服务器
以用户注册为例子,我们需要向服务器/register传送用户名name和密码password。from flask import Flask, request app = Flask(__name__) @app.route('/')def hello_world(): return 'hello world' @app.route('/register', method...
2019-02-03 02:27:11
3923
1
原创 C++读写XML--TinyXML
C++语言解析XML文件使用最广泛的库是TinyXML,TinyXML对应的官方文档如下:TinyXML官方文档:http://www.grinninglizard.com/tinyxmldocs/index.htmlTinyXML官方教程:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html本文主要参考官方文档,梳理出几...
2019-01-20 10:22:18
630
原创 C++读写JSON--JsonCpp和RapidJSON
目前C++语言解析JSON文件,使用最多的两个库分别是JsonCpp和RapidJSON,这两个库对应的官方文档分别如下:几乎所有用C++解析JSON的操作都可以在下面两个文档中查询到。JsonCpp:https://en.wikibooks.org/wiki/JsonCppRapidJSON:http://rapidjson.org/zh-cn/index.html...
2019-01-20 00:28:08
1440
原创 链接总结
本文主要参考书目为《深入理解计算机系统》和《程序员的自我修养》 链接的主要内容就是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。链接的过程主要包括了地址和空间分配、符号决议和重定位等这些步骤。 ----《程序员的自我修养》 链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。 ----《深入理解计算机系统》...
2018-12-30 15:09:47
494
原创 虚拟内存总结
本文主要参考《深入理解计算机系统》和《现代操作系统》两本经典书籍。 虚拟内存的基本思想:每个进程拥有自己的地址空间,这个空间被分割为多个块,每个块称作一页。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入...
2018-12-28 13:38:26
1958
原创 C++11--智能指针详解及实现
本文主要参考:1)《Effective Mordern C++》2)《C++ Primer》3)https://en.cppreference.com/w/cpp/memory/shared_ptr --可在线做实验测试代码1、shared_ptr的实现原理 智能指针的一种通用实现技术是使用引用计数。智能指针类将一个计数器与智能指针指向的对象相关联,用来记录有多少个智...
2018-09-10 10:51:17
3491
转载 C语言实现C++继承和多态
C++中的多态我们知道的是在C++中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用调用父类的虚函数则该父类的指针会在自己的虚函数表中查找自己的函数地址,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。//c++中的多态class Base{pub...
2018-08-23 14:08:54
858
原创 VC++使用pdb和dump恢复“案发现场”
目录 pdb文件PDB文件简介 EXE、DLL等与pdb文件的匹配编译器产生符号的过程Release程序生成pdb文件 dump文件使用背景介绍dump文件的生成调试dump文件VS调试 本地dump调试无源代码dump调试WinDbg调试pdb文件PDB文件简介pdb符号文件是连接二进制指令和源代码之间的纽带,没有符号你所面对只...
2018-08-06 14:15:06
5898
原创 《网络是怎样连接的》读书笔记
简介:本书是是一本不错的计算机网络入门书籍,能够对网络有一个全面的认识,力荐!! 不过,本书内容没有较深的理论,所以对于一些深入的问题,还需进一步阅读其他专业书籍。 下面是根据自己的理解整理的思维导图(点击放大),以及相关补充知识。 补充知识点第1章 浏览器生成消息 1 条请求消息中只能写1个URI。如果需要获取多个文件,必须对每个文件单独发送1 条请求。 协议栈:操...
2018-08-01 12:57:12
1786
1
原创 套接字编程入门
代码中使用到的API参见官网:https://docs.microsoft.com/zh-cn/windows/desktop/api/winsock2/UDP套接字关键步骤: 服务端 客户端 初始化WSA、创建socket 初始化WSA、创建soc...
2018-07-30 10:50:47
530
原创 Simple Factory Pattern--简单工厂模式
介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导。动机:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。定义:简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Facto...
2018-06-09 17:19:23
482
原创 Observer/Event观察者模式(C++)
动机: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”--一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。松耦合可以体现在下面几种情况:1)一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方...
2018-06-03 22:46:45
1988
1
原创 STL--allocator分配器
首先介绍一下执行new后的函数调用关系:new -> operator new -> malloc(CRT) -> 调用操作系统的内存分配API(Windows、Linux、Unix)介绍:std::allocator是STL容器使用的内存配置器,也是标准库唯一预定义的内存配置器。每个容器内部都有一个allocator,用来完成内存配置与释放,对象构造和析构的工作。特点:将内存分...
2018-06-03 15:48:33
1207
原创 Template Method 模板方法
Template Method是一种组件协作模式:通过晚绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。动机:在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。定义:定义一个操作中的算法的骨架(稳定),而将一些...
2018-06-02 11:01:01
818
原创 C++11 变参模板(variadic templates)
Variadic Template是C++11的一个很重要的特性;变体现在两个方面:(1)参数个数:利用参数个数逐一递减的特性,实现递归调用;(2)参数类型:参数个数逐一递减导致参数类型也逐一递减;两个注意点(1)递归调用(2)递归终止:使用重载的办法终止递归调用;举两个例子1.print函数/// Variadic template//重载的递归终止函数void printX() {}...
2018-05-26 11:52:12
6689
原创 C++模板特化
【理论待补充...】下面是一个函数模板特化的例子;/// 模版特化template <class T>int compare(const T left, const T right){ std::cout << "in template<class T>..." << std::endl; if (left < right) ret...
2018-05-25 23:51:05
272
原创 C++11下的单例模式
动机:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 绕过常规的构造器,提供一种机制来保证一个类只有一个实例。定义:保证一个类仅有一个实例,并提供一个该实例的全局访问点。1、C++11中可以保证static变量时多线程安全的,在底层实现了加锁操作,所以不需要像以前那样自己写加锁操作。2、由于是一个static对象,...
2018-05-25 13:29:15
8522
2
原创 C++实现多项式曲线拟合--polyfit
基本原理:幂函数可逼近任意函数。上式中,N表示多项式阶数,实际应用中一般取3或5;假设N=5,则:共有6个未知数,仅需6个点即可求解;可表示为矩阵方程:Y的维数为[R*1],U的维数[R * 6],K的维数[6 * 1]。R> 6时,超定方程求解:下面是使用C++实现的多项式拟合的程序,程序中使用opencv进行矩阵运算和图像显示。程序分别运行了N=3,5,7,9时的情况,结果如下:#inc...
2018-04-04 21:58:57
48123
19
翻译 命名约定--Google Style Guide
最重要的一致性规则是命名管理. 命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义: 类型, 变量, 函数, 常量, 宏, 等等, 甚至. 我们大脑中的模式匹配引擎非常依赖这些命名规则.命名规则具有一定随意性, 但相比按个人喜好命名, 一致性更重要, 所以无论你认为它们是否重要, 规则总归是规则.1.通用命名规则总述函数命名, 变量命名, 文件命名要有描述性; 少用缩写....
2018-02-27 11:55:51
647
原创 矩阵的遍历--按行、按列、蛇形
这里有一个假设: 在图像处理等领域中,二维矩阵已经按照行的方式存放在了一维数组mat中了。 矩阵的高记为height,宽记为width; 1.按行遍历for (int i = 0; i < height; ++i) for (int j = 0; j < width; ++j) mat[i*width + j];2.按列遍
2018-02-02 11:39:06
5429
原创 C++11--正则表达式
本文主要参考为《C++Primer第五版》 0.常用正则表达式中文字符:[\u4e00-\u9fa5]双字节字符(包括汉字在内):[^\x00-\xff]空白符:\n\s*\rEmail地址:[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w
2018-02-01 17:02:00
1620
翻译 C++实现字符串分割--split string
本文主要参考自《Split a String》 在别的一些语言中,包括Python,C#等语言中,字符串的分割都提供了标准的函数,但是C++没有提供相关的函数。 举个例子,给定一个字符串str = "the quick brown fox" will be splitted by " ",调用函数split(str, " ") ,然后会返回{"the", "quick", "bro
2017-12-30 18:59:12
3016
原创 C++11--范围for语句
range-based for statementC++11新标准引入了一种简单的for循环,这种语句可以遍历容器或其他序列的所有元素。 从编译器的角度去理解范围for语句的执行过程;实际上就是把范围for语句转换成了传统的for循环语句。 下面的两种执行过程完全等价,只是采用了不同的标准函数。//范围for循环for (decl : coll){ statement}//编...
2017-12-17 15:17:37
546
原创 C++11--Lambda表达式
《C++Primer》中对lambda表达式的解释如下: lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。 微软官网对lambda表达式的解释如下: 1、捕获列表(capture list)Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制
2017-12-16 23:23:28
434
原创 C++基于对象--Class with pointer--string类的简单实现
本文所谈的对象是带有指针的类(Class with pointer);这时不能使用编译器自动合成的三大函数(Big three):拷贝构造、拷贝赋值和析构。需要自己去显式的定义着三大函数;primer中给出的建议是:如果一个类需要需要自定义析构函数,几乎可以肯定它也需要自定义拷贝赋值运算符和拷贝构造函数。所以一般情况下,这三个函数总是一起自定义,或者一起不定义。在实际中,如果定义了其他...
2017-12-08 22:33:18
674
原创 C++基于对象--Class without pointer--complex的简单实现
要注意培养正规的、大气的编程习惯。 1、基于对象(Object Based):面向单一class的设计。 class有两种经典的分类: 一种不带有指针 另一种带有指针 2、面向对象(Object Oriented):面对的是多重classes的设计,classes和classes之间的关系。 -继承 -复合 -委托...
2017-12-07 09:12:42
393
原创 C++使用标准库--文本查询程序
题目:在给定文件中查询单词。查询结果是单词在文件中出现的次数及所在行的列表。如果一个单词在一行中多次出现,此行只显示一次,行会按照升序输出。效果如下:在此程序的实现中使用到的标准库内容包括:(1)ifstream:用来绑定并打开指定的文本。(2)vector:用来保存整个文本,每行保存为vector中的元素。(3)istringstream:用来将每行分解为单词。(
2017-12-02 21:48:36
895
原创 C++STL--map和set 词频统计和单词转换
set简介set官方参考连接:http://www.cplusplus.com/reference/set/set/1.set是按特定顺序存储的容器,元素值唯一。 2.set中的元素是const类型的,不能被修改,但是可以执行插入(insert)和删除(erase)。 3.set的底部实现为RB-tree. map简介map官方参考连接:http://www.cpl
2017-11-30 11:01:13
1448
原创 C++IO库--fstream和stringstream
注意:IO对象无拷贝或赋值,需要以引用的方式传递参数和返回流。istringstream和ifstream的使用(1)使用ifstream从文件中读取文本,一行为一个元素存入vector<string>中;(2)使用istringstream从vector<string>读取元素,每次读一个单词(3)使用ifstream从文件中读取文本,每次...
2017-11-30 10:50:03
1298
原创 OpenCV—漫水填充floodFill之区域信息统计
本文的主要参考为1、官方文档OpenCV249-floodFill2、《Learning OpenCV 3》page361-364OpenCV中提供的直线拟合API如下:floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), S
2017-10-28 23:25:53
4191
原创 OpenCV—直线拟合fitLine
本文的主要参考为官方文档OpenCV249-fitLine和博客-OpenCV 学习(直线拟合)以及《Learning OpenCV 3》page425-426OpenCV中提供的直线拟合API如下:void fitLine(InputArray points, OutputArray line, int distType, double param, double rep
2017-10-27 15:18:02
16596
1
原创 OpenCV—椭圆拟合fitEllipse
本文的主要参考为官方文档OpenCV249-fitEllipse和博客-opencv中的椭圆拟合以及《Learning OpenCV 3》page424-425OpenCV中提供的椭圆拟合API如下:RotatedRect fitEllipse(InputArray points)输入:二维点集,要求拟合的点至少为6个点。存储在std::vector<> or Mat处理:该函
2017-10-26 21:32:09
60536
7
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人