C/C++
文章平均质量分 79
u012507022
昨夜西风凋碧树,独上高楼,望尽天涯路
展开
-
设计模式之观察者模式学习笔记
定义对象间的一种一对多的依赖关系 ,让多个观察者对象同时监听某一个主题对象,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新,又叫发布-订阅(publish-subscribe)模式。原创 2022-08-20 18:28:53 · 1212 阅读 · 1 评论 -
设计模式学习笔记之设计模式概述
目录1、设计模式概念2、设计模式4个基本要素3、设计模式分类4、设计模式原则1、设计模式概念设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构。..原创 2020-06-16 22:15:42 · 445 阅读 · 0 评论 -
C++拷贝控制含有指针成员的类
当定义一个类时,我们显式地或隐式地指定了此类型的对象在拷贝、赋值和销毁时做什么。一个类通过定义五种种特殊的成员函数来控制这些操作:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。在一个类中,如果类 没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写 析构函数来管理内存。对于含有指针成员的类的对象调用...原创 2020-05-03 19:47:01 · 895 阅读 · 0 评论 -
C++动态绑定
绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。绑定是在编译时进行的,叫作静态绑定,也叫做静态联编。动态绑定(动态联编/运行时绑定)则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行。(1)在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定,所以说虚函数是动态绑定的基础。(2)动态绑定是和类的继承以及多态相联系的,在继承关系中...原创 2020-05-03 19:47:28 · 1045 阅读 · 1 评论 -
C++可调用对象学习笔记
可调用对象:对于一个对象或者表达式,如果可以对其使用函数调用运算符,则称它为可调用的;即,如果e是一个可调用的表达式,则我们可以编写 e(args),其中 args 是一个逗号分割的一个或多个参数的列表。函数调用运算符是一对圆括号(),里面放置实参列表,也可能为空。具有函数行为或功能的一组语句视为可调用对象;一组执行任务的语句都可以视为一个函数,一个可调用对象。在程序设计的过程中,我们习惯于把...原创 2020-05-03 19:48:00 · 434 阅读 · 0 评论 -
C++11多线程 unique_lock详解
目录1.unique_lock取代lock_guard2. unique_lock的第二个参数2.1 std::adopt_lock2.2 std::try_to_lock2.3 std::defer_lock3. unique_lock的成员函数3.1 lock(),加锁3.2 unlock(),解锁3.3 try_lock()3.4 release()...原创 2019-01-06 09:07:15 · 79403 阅读 · 4 评论 -
C++11单例设计模式共享数据分析
目录1.设计模式大概谈2.单例设计模式3.单例设计模式共享数据分析、解决4.std::call_once()1.设计模式大概谈“设计模式”:代码的一些写法(这些写法跟常规写法不怎么一样):程序灵活,维护起来可能很方便,但是别人接管、阅读代码都会很痛苦。用“设计模式”理念写出的代码很晦涩的。《head first》讲设计模式,可以了解一下。老外为应付特别大的项目的时候...原创 2019-01-06 12:04:02 · 1028 阅读 · 1 评论 -
C++11多线程 条件变量condition_variable
1.条件变量std:: condition_variable、wait()、notify_one()std:: condition_variable实际上是个类,是一个与条件相关的类,说白了就是等待一个条件的达成。这个类是需要和互斥量来配合工作的,用的时候我们要生成这个类的对象。实例代码:线程A:等待一个条件满足线程B:专门往消息队列扔消息(数据)2.代码深思考视频教程,老...原创 2019-01-06 20:01:40 · 1770 阅读 · 0 评论 -
C++11 多线程 async、future、packaged_task、promise
1.std::async std::future创建后台任务并返回值目的:希望线程返回一个结果std::async是个函数模板,用来启动一个异步任务,启动起来一个异步任务。什么叫“启动一个异步任务”,就是自动创建一个线程并开始执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象里面就含有线程函数返回的结果,我们可以通过调用std::future对象的...原创 2019-01-06 23:27:59 · 1331 阅读 · 0 评论 -
C++11多线程 原子操作概念及范例
互斥量:多线程编程中保护共享数据:先锁,操作共享数据,开锁大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式;原子操作:是在多线程中不会被打断的程序片段;原子操作比互斥量更胜一筹;互斥量的加锁一般针对一个代码段,原子操作针对的一般都是一个变量,而不是一个代码段。原子操作,一般都是指“不可分割的操作”,也就是说这种操作状态要么是完成的,要么是没完成的,...原创 2019-01-08 21:03:26 · 838 阅读 · 0 评论 -
C++11 多线程std:: async与std::thread的区别
1. std::async与std::thread的区别std::async()与std::thread()最明显的不同,就是async并不一定创建新的线程std::thread() 如果系统资源紧张,那么可能创建线程失败,整个程序可能崩溃。std::thread()创建线程的方式,如果线程返回值,你想拿到这个值也不容易;std::async()创建异步任务,可能创建也可能不创建线...原创 2019-01-08 21:43:54 · 13005 阅读 · 1 评论 -
C++11多线程 互斥量与Windows临界区
1.Windows临界区Windows临界区与互斥量用法非常相似;但也有些差别在“同一个线程”(不同线程中会卡住等待)中, Windows中的“相同临界区变量”代表的临界区的进入(EnterCriticalSection)可以被多次调用,但是调用了几次EnterCriticalSection(),就得调用几次EnterCriticalSection()而在C++11中,std::mut...原创 2019-01-09 21:50:03 · 1774 阅读 · 0 评论 -
理解C++传值、传址、引用调用
使用C++很长时间,对一些最基本的知识点不求甚解,有时会犯很低级的错误,并且这些bug在调试中很难发现。以前只了解传值、传址、引用调用的区别,没有深入了解,今天稍微总结一下,今后慢慢深入。1.传值调用在传值调用时,实参被拷贝了一份,然后在函数体内使用,函数体内修改参数变量时修改的只是实参的一份拷贝,而实参本身没有改变。通过例子来看,代码运行结果:void funcValue(int ...原创 2019-03-30 14:13:33 · 3131 阅读 · 0 评论 -
C++11多线程 互斥量的概念、用法、死锁演示及解决详解
目录1.互斥量(mutex)的基本概念2.互斥量的用法2.1 lock()、unlock()2.2 std::lock_guard类模板3.死锁3.1 死锁演示3.2 死锁的一般解决方案3.3 std::lock()函数模板3.4 std::lock_guard()的std::adopt_lock参数1.互斥量(mutex)的基本概念保护共享数据,操作时...原创 2019-01-05 21:39:22 · 2179 阅读 · 0 评论 -
C++11多线程 创建多个线程、数据共享问题
目录1.创建和等待多个线程2.数据共享问题分析2.1 只读数据2.2 有读有写:3.共享数据的保护案例代码1.创建和等待多个线程a)多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关;b)主线程等待所有子线程运行结束,最后主线程结束,推荐使用这种join的写法,更容易写出稳定的程序;c)咱们把thread对象放入到容器里管理,看起开像个thread对...原创 2019-01-05 15:39:16 · 2168 阅读 · 0 评论 -
return与exit()的区别
return返回函数值,是关键字;exit是一个函数。return语言提供的,是语言级别的,它表示了调用堆栈的返回,是函数的退出(返回);而exit是操作系统提供的(或者函数库中给出的),是系统调用级别的,它表示了一个进程的结束。exit()退出程序,把控制权交给操作系统;return结束当前函数,返回函数值,把控制权交给调用函数。return用于结束一个函数的执行,将函数的执行信息传出个其他调用原创 2016-04-29 21:01:19 · 697 阅读 · 0 评论 -
MNIST数据集转换为图像
很多的深度学习框架都有以MNIST为数据集的demo,MNIST是很好的手写数字数据集。在网上很容易找到资源,但是下载下来的文件并不是普通的图片格式。不转换为图片格式也可以用。但有时,我们希望得到可视化的图片格式。MNIST数据集包含4个文件:train-images-idx3-ubyte:training set images train-labels-idx1-ubyte:tr原创 2016-05-11 21:44:24 · 18197 阅读 · 1 评论 -
C++异常处理之abort()、异常机制、exception 类
程序运行时有时会遇到错误,导致程序无法正常运行下去,通常程序员会试图预防这种意外。C++异常为处理这种情况提供了一种功能强大而灵活的工具。这里仅总结三种:调用abort()函数异常机制exception 类一、调用abort()函数Abort()函数的原型位于头文件cstdlib(或stdlib.h)中,其典型实现是向标准错误流(即cerr使用的错误流)发送 abn原创 2016-05-02 18:51:09 · 16540 阅读 · 0 评论 -
双目立体视觉SAD匹配算法
SAD(Sum of absolute differences)是一种图像匹配算法。基本思想:差的绝对值之和。此算法常用于图像块匹配,将每个像素对应数值之差的绝对值求和,据此评估两个图像块的相似度。该算法快速、但并不精确,通常用于多级处理的初步筛选。原创 2016-05-22 13:09:20 · 30050 阅读 · 22 评论 -
比较函数指针、函数符和lambda函数
函数指针函数指针即函数的地址,函数的地址是存储其机器语言代码内存的开始地址。函数的地址可作为其他函数的参数。函数符函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象(即定义了函数operator()()的类)。函数符是一个类对象,并非只能像函数名那样使用它,这要归功于类方法operator()()。函数符的优点之一是,可使用同一个原创 2016-07-18 19:05:32 · 3230 阅读 · 0 评论 -
Hough变换检测椭圆 附带matlab与opencv代码
由椭圆的公式(1)可得,确定一个椭圆需要5个参数,a,b 为椭圆的长轴和段轴,P,Q 为椭圆中心坐标,θ为椭圆的旋转角度。如果用传统的Hough变换方法,参数空间需要五维。这种方法在计算过程中所耗费的时间和空间资源是惊人的,根本无法应用于实际。为此,人们提出了很多新的改进算法。 改进算法主要分为两种:1)随机Hough变换(RHT),采用多到一的映射,但是随机采样会带来原创 2016-03-25 13:52:09 · 39326 阅读 · 28 评论 -
递归调用学习笔记
所谓函数的递归调用是指在调用一个函数的过程中出现直接或间接调用该函数自身的情况。例如,在调用f1()函数的过程中,又调用了f1()函数,这称为直接递归调用;而在调用f1()函数的过程中,调用了f2()函数,又在调用了f2()函数的过程中调用了f1()函数,这称为间接递归调用。 提到递归调用,最常用的例子就是求一个正整数的阶乘问题。例如,求整数5的阶乘,即5!。由于5!=5*4!,4原创 2016-08-27 21:25:11 · 987 阅读 · 0 评论 -
C++常类型
常类型是指定义时,使用const修饰的类型,常类型的变量或者对象的值不能被修改,所以定义常量时必修进行初始化,否者编译错误。 1. 一般常量(简单类型或数组的常量)与对象常量初始化后不能被更改;常量定义时,修饰符const可以放在类型说明符前,也可放在类型说明符后。 2. 关于指针的常量分为三种:常量指针、指向常量的指针和指向常量的常指针常量指针:地址是常量,所以地址值是不可改变的,但...原创 2018-11-11 16:59:18 · 1332 阅读 · 0 评论 -
C++11多线程 并发、进程、线程基本概念和综述
目录1、并发、线程、进程的概念1.1并发1.2可执行程序1.3进程1.4线程1.5学习心得二、并发的实现方法2.1多进程并发2.2多线程并发2.3总结三:C++11新标准线程库1、并发、线程、进程的概念1.1并发两个或者多个任务(独立的活动)同时发生:一个程序同时执行多个独立的任务;单核CPU的计算机在某一个时刻只能执行一个任务,由操作系...原创 2019-01-03 21:56:40 · 834 阅读 · 0 评论 -
C++11多线程 线程启动、结束、创建多线程方法
目录1、范例演示线程运行的开始和结束1.1 thread:标准库里的类1.2 join()1.3 detach()1.4 joinable()2.其他创建线程的方法2.1 用类对象(可调用对象),以及一个问题范例2.2 用lambda表达式1、范例演示线程运行的开始和结束程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;main()函数就是主线程,...原创 2019-01-04 21:30:16 · 8566 阅读 · 1 评论 -
C++11多线程 多线程传参详解
1.传递临时对象做线程参数1.1要避免的陷阱1用detach()时,如果主线程先结束,变量就会被回收;所以用detach()的话,不推荐用引用,同时绝对不能用指针。1.2要避免的陷阱2只要临时对象的用临时构造A类对象作为参数传递给线程,那么就一定能够在主线程结束之前,把线程函数的第二个参数构建出来,从而确保即便detach()子线程也安全运行,程序如下:#include<...原创 2019-01-05 13:48:25 · 4838 阅读 · 2 评论 -
C++vector<vector<double>> and opencv Mat
最近在写Opencv程序,用到离散小波变换,但Opencv没有提供离散小波变换函数。但找到了离散小波变换函数的C++程序,发现在C++中,可以用 vectordouble>> 来表示矩阵。int Height = 200;int Width = 400;vectordouble>> signal2(Height,Width); cout"矩阵的行数"endl;cout"原创 2016-03-25 13:52:27 · 7054 阅读 · 2 评论