C++
文章平均质量分 51
i_chaoren
这个作者很懒,什么都没留下…
展开
-
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 · 793 阅读 · 0 评论 -
C++模板--基础篇
动机:模板的存在是为了消除重复代码,提高代码复用率的。方案:根据给定类型生成所需函数。函数模板函数模板是C++模板机制中的yi原创 2020-02-29 15:03:16 · 471 阅读 · 0 评论 -
【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 · 806 阅读 · 0 评论 -
移动语义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 · 596 阅读 · 1 评论 -
C语言实现C++继承和多态
C++中的多态我们知道的是在C++中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用调用父类的虚函数则该父类的指针会在自己的虚函数表中查找自己的函数地址,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。//c++中的多态class Base{pub...转载 2018-08-23 14:08:54 · 752 阅读 · 0 评论 -
Template Method 模板方法
Template Method是一种组件协作模式:通过晚绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。动机:在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。定义:定义一个操作中的算法的骨架(稳定),而将一些...原创 2018-06-02 11:01:01 · 771 阅读 · 0 评论 -
Observer/Event观察者模式(C++)
动机: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”--一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。松耦合可以体现在下面几种情况:1)一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方...原创 2018-06-03 22:46:45 · 1948 阅读 · 1 评论 -
STL--allocator分配器
首先介绍一下执行new后的函数调用关系:new -> operator new -> malloc(CRT) -> 调用操作系统的内存分配API(Windows、Linux、Unix)介绍:std::allocator是STL容器使用的内存配置器,也是标准库唯一预定义的内存配置器。每个容器内部都有一个allocator,用来完成内存配置与释放,对象构造和析构的工作。特点:将内存分...原创 2018-06-03 15:48:33 · 1158 阅读 · 0 评论 -
C++11 变参模板(variadic templates)
Variadic Template是C++11的一个很重要的特性;变体现在两个方面:(1)参数个数:利用参数个数逐一递减的特性,实现递归调用;(2)参数类型:参数个数逐一递减导致参数类型也逐一递减;两个注意点(1)递归调用(2)递归终止:使用重载的办法终止递归调用;举两个例子1.print函数/// Variadic template//重载的递归终止函数void printX() {}...原创 2018-05-26 11:52:12 · 6519 阅读 · 0 评论 -
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 · 254 阅读 · 0 评论 -
C++11下的单例模式
动机:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 绕过常规的构造器,提供一种机制来保证一个类只有一个实例。定义:保证一个类仅有一个实例,并提供一个该实例的全局访问点。1、C++11中可以保证static变量时多线程安全的,在底层实现了加锁操作,所以不需要像以前那样自己写加锁操作。2、由于是一个static对象,...原创 2018-05-25 13:29:15 · 8382 阅读 · 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 · 46686 阅读 · 19 评论 -
Simple Factory Pattern--简单工厂模式
介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导。动机:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。定义:简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Facto...原创 2018-06-09 17:19:23 · 449 阅读 · 0 评论 -
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 · 5354 阅读 · 0 评论 -
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 · 3384 阅读 · 0 评论 -
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 · 1403 阅读 · 0 评论 -
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 · 596 阅读 · 0 评论 -
Bridge桥模式
“单一职责”模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同事充斥着重复代码,这时候的关键是划分责任。动机由于某些类型的固有的实现逻辑,使得它们具有两个纬度的变化,乃至多个纬度的变化。如何应对这种"多维度的变化"?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?处理多维度变化的场景...原创 2019-05-02 23:32:40 · 982 阅读 · 0 评论 -
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 · 726 阅读 · 0 评论 -
C++11 多线程编程--线程安全队列
1 std::thread类的构造函数是使用可变参数模板实现的,也就是说,可以传递任意个参数,第一个参数是线程的入口函数(可调用对象),而后面的若干个参数是该函数的参数。2 std::mutex有两种操作:锁定(lock)与解锁(unlock)。3 std::lock_guard在类的构造函数中创建资源,在析构函数中释放资源,因为就算发生了异常,c++也能保证类的析构函数能够执行。4 ...原创 2019-08-18 21:41:10 · 1344 阅读 · 0 评论 -
命名约定--Google Style Guide
最重要的一致性规则是命名管理. 命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义: 类型, 变量, 函数, 常量, 宏, 等等, 甚至. 我们大脑中的模式匹配引擎非常依赖这些命名规则.命名规则具有一定随意性, 但相比按个人喜好命名, 一致性更重要, 所以无论你认为它们是否重要, 规则总归是规则.1.通用命名规则总述函数命名, 变量命名, 文件命名要有描述性; 少用缩写....翻译 2018-02-27 11:55:51 · 590 阅读 · 0 评论 -
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 · 1365 阅读 · 0 评论 -
C++使用标准库--文本查询程序
题目:在给定文件中查询单词。查询结果是单词在文件中出现的次数及所在行的列表。如果一个单词在一行中多次出现,此行只显示一次,行会按照升序输出。效果如下:在此程序的实现中使用到的标准库内容包括:(1)ifstream:用来绑定并打开指定的文本。(2)vector:用来保存整个文本,每行保存为vector中的元素。(3)istringstream:用来将每行分解为单词。(原创 2017-12-02 21:48:36 · 842 阅读 · 0 评论 -
C++基于对象--Class without pointer--complex的简单实现
要注意培养正规的、大气的编程习惯。 1、基于对象(Object Based):面向单一class的设计。 class有两种经典的分类: 一种不带有指针 另一种带有指针 2、面向对象(Object Oriented):面对的是多重classes的设计,classes和classes之间的关系。 -继承 -复合 -委托...原创 2017-12-07 09:12:42 · 356 阅读 · 0 评论 -
STL中vector的底层解析及简易实现
vector是一种动态增长的数组,当原始容量被用尽后,在别的地方进行扩充,大小为原来的2倍,然后将内容拷贝过去;成长过程如下图所示;下面是vector的关键源代码;template<class T, class Alloc = alloc>class vector {public: typedef T value_type; //vector中的迭代器就是一个指针...原创 2017-08-13 15:17:19 · 1668 阅读 · 0 评论 -
VS中添加第三方库及相对路径设置
对于一些第三方的SDK,一般会包含头文件(*.h),静态库文件(*.lib)和动态库文件(*.dll)。1. 文件位置:为了提高程序的可移植性,将第三库放在解决方案(*.sln)或者工程(*.vcxproj)文件所在的文件夹下。而不要放在其他地方,比如放在D:\某个位置,这样的话,程序在别的电脑上可能就无法运行了。2. 头文件:在工程属性->VC++目录->包含目录中添加头文件目录 ;原创 2017-09-08 13:18:58 · 18516 阅读 · 0 评论 -
C++多态--虚函数virtual及override
C++多态C++多态(polymorphism)是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。如果没有使用虚函数的话,即没有利用C+原创 2017-08-16 23:35:52 · 85547 阅读 · 9 评论 -
C++IO库--fstream和stringstream
注意:IO对象无拷贝或赋值,需要以引用的方式传递参数和返回流。istringstream和ifstream的使用(1)使用ifstream从文件中读取文本,一行为一个元素存入vector<string>中;(2)使用istringstream从vector<string>读取元素,每次读一个单词(3)使用ifstream从文件中读取文本,每次...原创 2017-11-30 10:50:03 · 1245 阅读 · 0 评论 -
C++reference引用
引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。使用引用参数的主要原因有两个。1、程序员能够修改调用函数中的数据对象。2、通过传递引用而不是整个数据对象,可以提高程序的运行速度。当数据对象较大时(如结构和类对象),第二个原因最重要。什么时候使用引用、什么时候使用指针?什么时候按值传递?下面是一些指导原则?对于使用传递的值而不修改的函原创 2017-02-14 20:21:06 · 3845 阅读 · 4 评论 -
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 · 1398 阅读 · 0 评论 -
矩阵的遍历--按行、按列、蛇形
这里有一个假设: 在图像处理等领域中,二维矩阵已经按照行的方式存放在了一维数组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 · 5261 阅读 · 0 评论 -
C++11--范围for语句
range-based for statementC++11新标准引入了一种简单的for循环,这种语句可以遍历容器或其他序列的所有元素。 从编译器的角度去理解范围for语句的执行过程;实际上就是把范围for语句转换成了传统的for循环语句。 下面的两种执行过程完全等价,只是采用了不同的标准函数。//范围for循环for (decl : coll){ statement}//编...原创 2017-12-17 15:17:37 · 468 阅读 · 0 评论 -
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 · 2954 阅读 · 0 评论 -
C++11--Lambda表达式
《C++Primer》中对lambda表达式的解释如下: lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。 微软官网对lambda表达式的解释如下: 1、捕获列表(capture list)Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制原创 2017-12-16 23:23:28 · 387 阅读 · 0 评论 -
C语言--字符串操作总结
一、字符串操作1、原型:strcpy(chardestination[], const char source[]); 功能:将字符串source拷贝到字符串destination中 例程: #include #include void main(void) { charstr1[10] = { "TsinghuaOK"}; charstr2[1原创 2017-05-12 15:32:06 · 445 阅读 · 0 评论 -
C++const限定符
1.const对象的初始化如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要。int i = 42;const int ci = i; //正确,非const对象被拷贝给了const对象int j = ci; //正确,const对象拷贝给了非const对象ci的常量特征仅仅在执行改变ci的操作时才会发挥作用。一旦拷贝完成,新的对象就和原来的对象没有任...原创 2016-12-13 23:48:22 · 419 阅读 · 0 评论 -
C++基于对象--Class with pointer--string类的简单实现
本文所谈的对象是带有指针的类(Class with pointer);这时不能使用编译器自动合成的三大函数(Big three):拷贝构造、拷贝赋值和析构。需要自己去显式的定义着三大函数;primer中给出的建议是:如果一个类需要需要自定义析构函数,几乎可以肯定它也需要自定义拷贝赋值运算符和拷贝构造函数。所以一般情况下,这三个函数总是一起自定义,或者一起不定义。在实际中,如果定义了其他...原创 2017-12-08 22:33:18 · 621 阅读 · 0 评论 -
C++转换函数和隐式类类型转换
基础类型转换基础类型转为类类型类类型转换为基础类型原创 2017-12-14 21:37:57 · 852 阅读 · 0 评论 -
最小二乘法直线拟合
/************************************************************************//* 函数名称:最小二乘法拟合直线 函数功能:由给定的一组坐标求出直线斜率k和截距k 参数:int x[], int y[]表示坐标,float &k,float &b为返回的k和b;/*********************原创 2016-12-09 20:12:18 · 1334 阅读 · 0 评论