自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

转载 json文件解析

json文件解析目录对json文本的解析有两种方法:第一种:利用 child指针进行访问第二种:定义cJSON结构体指针进行访问正文回到顶部对json文本的解析有两种方法:回到顶部第一种:利用 child指针进行访问利用child指针进行访问,需要不断的进行child,以进入深层循环中。访问面文本的slots数组中的成员复制代码{“semantic”:{“slots”:[{“name”:“ZhangSan”,“ip”:“ZhangSan”},{“name”:“LiS

2021-11-30 17:53:04 1597

转载 Make、Makefile、CMake和CMakeLists

一. Make在 认识编译器和C/C++编译 一文中介绍过,一个 .c/.cpp 文件从源文件到目标文件的过程叫做编译,但是一个项目中不可能只存在一个文件,这就涉及到多个文件的编译问题,在编译的过程中必然涉及某个文件的先编译,某个文件的后编译。构建过程就是安排文件的编译先后关系。Make 就是一种构建工具,属于 GNU 项目。在 Mac 上输入 make -version 可查看 make 工具的版本。>> 执行make -version >> 输出GNU Make 3

2021-09-10 02:34:11 670

转载 C++类型转换函数(类型转换运算符函数)

用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。**C++提供类型转换函数(type conversion function)来解决这个问题。类型转换函数的作用是将一个类的对象转换成另一类型的数据。**如果已声明了一个Complex类,可以在Complex类中这样定义类型转换函数:operator double( ){return real;}函数返回double型变量real

2021-08-20 18:03:58 3003 1

转载 C++枚举类型enum与enum class的使用方法是什么

一.关于枚举类型什么是枚举类型?答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class)。enum与enum class的区别?(为什么需要限定作用域?)答:枚举作用域是指枚举类型成员名字的作用域,起自其声明之处,终止枚举定义结束之处。enu

2021-08-20 16:38:28 4461

转载 C语言字节对齐问题详解

引言考虑下面的结构体定义:typedef struct{ char c1; short s; char c2; int i;}T_FOO;假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4。现在,我们编写一个简单的程序:复制代码int main(void){ T_FOO a; printf("c1 -> %d, s -> %d, c2 -> %d,

2020-09-17 16:22:28 918

原创 三、带参数信号与槽

在subwidget.h中声明一个signal. 和之前的信号函数重名但是有参数:void backSignal(QString);之后在subwidget.cpp的槽函数sendSignal()中也发送该信号:emit backSignal("子窗口请求返回");在mainwidget.h中声明一个槽函数来响应该信号:void logSlot(QString);并在mainwidget.cpp中定义该槽函数, 打印信号传过来的字符串:void MainWidget::logSlot(

2020-07-08 11:24:58 916

原创 二、自定义信号和槽

1. 自定义槽槽可以是任何成员函数、普通全局函数、静态函数槽函数和信号的参数和返回值要一致由于信号是没有返回值的, 槽函数也一定没有返回值首先在mainwidget.h中添加槽函数:public slots: void mySlot();之后在mainwidget.cpp文件中定义槽函数:void MainWidget::mySlot(){ b2->setText("^_^");}现在, 我们希望当Button2按下时, Button2显示的文本变成笑脸,

2020-07-08 11:21:01 1214

原创 一、信号和槽

1. 新建工程新建一个"Qt Widgets Application"工程2. 添加按钮一个Qt工程会有很多个控件, 如果把逻辑代码都写在main函数里, main函数会非常长, 而且不方便维护, 所以最好把代码都在别的Sources中实现.- 2.1 修改mainwidget.h文件在 mainwidget.h 文件中添加头文件, 然后定义两个按钮, 一个正常定义, 一个使用指针:#ifndef MAINWIDGET_H#define MAINWIDGET_H#include &l

2020-07-08 11:09:39 402

原创 putenv()函数和getenv()函数

- C语言getenv()函数:取得环境变量内容头文件:#include <stdlib.h>定义函数:char * getenv(const char *name);函数说明:getenv()用来取得参数 name 环境变量的内容(linux命令env可以用来查看环境变量). 参数name 为环境变量的名称, 如果该变量存在则会返回指向该内容的指针.返回值:执行成功则返回指向该内容的指针, 找不到符合的环境变量名称则返回NULL.范例#include <stdlib.

2020-06-22 14:05:32 2397

原创 C++默认初始化和值初始化、 直接初始化和拷贝初始化

默认初始化和值初始化一一对应前提知识声明: 在环境/上下文中指定一个变量的名字。也就是说,声明仅仅是让编译器知道,而没有实际分配空间。初始化:给一个声明后尚未初始化的变量一个有意义的初始值。赋值 : 销毁一个变量原来的值,并赋予一个新值。相当于改变了一个变量的状态。默认初始化:对象可能产生未定义的值(是否绝对尚待确定,例如类类型(定义了默认构造函数)的默认初始化是否属于值初始化等)。值初始化:对象的值是确定(预设)的。值初始化出现场景:1.数组初始化时初始值数量小于维度,剩下的元素会进行

2020-05-22 22:17:47 1377

转载 c++创建对象带括号和不带括号的区别

class Test{public:  Test() {}  Test(int a) {}}1、栈上创建对象1.1 无括号Test a; // 调用默认构造函数,栈上分配内存创建对象1.2 有括号Test a(); // 无任何意义,声明一个返回值为Test,参数为空,名字叫做a的函数1.3 有括号+参数Test a(2); // 调用构造函数Test(int a),栈上分配内存创建对象2、堆上创建对象2.1 无括号Test *a = new Test; // 调用默认

2020-05-22 22:03:53 529

原创 大数据

大数据是什么?:全新的思维方式和商业模式大数据的定义:广义:物理世界到数字世界的映射和提炼,发现数据的特征做出提升效率的决策行为狭义:获取、储存、分析,从大数据中挖掘价值的全新技术架构明白三件事:3.1大数据要做什么获取、储存、分析数据3.2对谁来做对大容量数据操作3.3目的是什么挖掘价值大数据有多大:大数据是PB和EB级别,1PB=1024TB,1EB=1024PB大数据的四个VVolume-海量化Variety-多样化Velocity-时效性Value-价值密度大.

2020-05-20 17:18:48 197

原创 C++11并发与多线程笔记(13) 补充知识、线程池浅谈、数量谈、总结

第十三章 补充知识、线程池浅谈、数量谈、总结一、补充一些知识点1.1 虚假唤醒:notify_one或者notify_all唤醒wait()后,实际有些线程可能不满足唤醒的条件,就会造成虚假唤醒,可以在wait中再次进行判断解决虚假唤醒。解决:wait中要有第二个参数(lambda),并且这个lambda中要正确判断所处理的公共数据是否存在。2.2 atomic:std::atomic<int> atm = 0; cout << atm << endl;

2020-05-13 11:06:34 3386 1

原创 C++11并发与多线程笔记(12) windows临界区、其他各种mutex互斥量

第十二节 windows临界区、其他各种mutex互斥量一和二、windows临界区Windows临界区,同一个线程是可以重复进入的,但是进入的次数与离开的次数必须相等。C++互斥量则不允许同一个线程重复加锁。windows临界区是在windows编程中的内容,了解一下即可,效果几乎可以等同于c++11的mutex包含#include <windows.h>windows中的临界区同mutex一样,可以保护一个代码段。但windows的临界区可以进入多次,离开多次,但是进入的次数与

2020-05-13 11:03:21 2892

原创 C++11并发与多线程笔记(11) std::atomic续谈、std::async深入谈

第十一节 std::atomic续谈、std::async深入谈一、std::atomic续谈#include <iostream>#include <thread>#include <atomic>using namespace std;std::atomic<int> g_count = 0; //封装了一个类型为int的 对象(值) void mythread1() { for (int i = 0; i < 1000000;

2020-05-13 10:58:56 2487 2

原创 C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic

第十节 future其他成员函数、shared_future、atomic一、std::future 的成员函数1、std::future_status status = result.wait_for(std::chrono::seconds(几秒));卡住当前流程,等待std::async()的异步任务运行一段时间,然后返回其状态std::future_status。如果std::async()的参数是std::launch::deferred(延迟执行),则不会卡住主流程。std::futu

2020-05-13 10:54:46 3048 2

原创 C++11并发与多线程笔记(9) async、future、packaged_task、promise

第九节、async、future、packaged_task、promise本节内容需要包含头文件#include 一、std::async、std::future创建后台任务并返回值std::async是一个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,它返回一个std::future对象,这个对象是个类模板。什么叫“启动一个异步任务”?就是自动创建一个线程,并开始 执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就含有线程入口函数所返回

2020-05-13 10:44:45 4179 3

原创 C++11并发与多线程笔记(8) condition_variable、wait、notify_one、notify_all

第八节 condition_variable、wait、notify_one、notify_all一、条件变量condition_variable、wait、notify_one、notify_allstd::condition_variable实际上是一个类,是一个和条件相关的类,说白了就是等待一个条件达成。std::mutex mymutex1;std::unique_lock<std::mutex> sbguard1(mymutex1);std::condition_variab

2020-05-13 10:37:54 7160 8

原创 C++11并发与多线程笔记(7) 单例设计模式共享数据分析、解决,call_once

第七节 单例设计模式共享数据分析、解决,call_once1.设计模式程序灵活,维护起来可能方便,用设计模式理念写出来的代码很晦涩,但是别人接管、阅读代码都会很痛苦老外应付特别大的项目时,把项目的开发经验、模块划分经验,总结整理成设计模式中国零几年设计模式刚开始火时,总喜欢拿一个设计模式往上套,导致一个小小的项目总要加几个设计模式,本末倒置设计模式有其独特的优点,要活学活用,不要深陷其中,生搬硬套2.单例设计模式:整个项目中,有某个或者某些特殊的类,只能创建一个属于该类的对象。单例类:

2020-05-13 10:34:04 3987 1

原创 C++11并发与多线程笔记(6) unique_lock(类模板)详解

第六节 unique_lock(类模板)详解1.unique_lock取代lock_guardunique_lock比lock_guard灵活很多(多出来很多用法),效率差一点。unique_lock myUniLock(myMutex);2.unique_lock的第二个参数2.1 std::adopt_lock:表示这个互斥量已经被lock(),即不需要在构造函数中lock这个互斥量了。前提:必须提前locklock_guard中也可以用这个参数2.2 std::try_to_l

2020-05-13 10:26:42 5910 2

原创 C++11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解

第五节 互斥量概念、用法、死锁演示及解决详解一、互斥量(mutex)的基本概念互斥量就是个类对象,可以理解为一把锁,多个线程尝试用lock()成员函数来加锁,只有一个线程能锁定成功,如果没有锁成功,那么流程将卡在lock()这里不断尝试去锁定。互斥量使用要小心,保护数据不多也不少,少了达不到效果,多了影响效率。二、互斥量的用法包含#include 头文件2.1 lock(),unlock()步骤:1.lock(),2.操作共享数据,3.unlock()。lock()和unlock()

2020-05-13 10:15:17 6621 2

原创 C++11并发与多线程笔记(4) 创建多个线程、数据共享问题分析、案例代码

第四节 创建多个线程、数据共享问题分析、案例代码一、创建和等待多个线程void TextThread(){ cout << "我是线程" << this_thread::get_id() << endl; /* … */ cout << "线程" << this_thread::get_id() << "执行结束" << endl; } //main函数里 vector

2020-05-13 10:08:06 6134 6

原创 C++11并发与多线程笔记(3) 线程传参详解,detach()大坑,成员函数做线程函数

第三节 线程传参详解,detach()大坑,成员函数做线程函数一、传递临时对象作为线程参数1.1要避免的陷阱1:#include <iostream>#include <thread>using namespace std;void myPrint(const int &i, char* pmybuf){ //如果线程从主线程detach了 //i不是mvar真正的引用,实际上值传递,即使主线程运行完毕了,子线程用i仍然是安全的,但仍不推荐传递引用 /

2020-05-13 10:04:17 8726 7

原创 C++11并发与多线程笔记(2) 线程启动、结束,创建线程多法、join,detach

第二节 线程启动、结束,创建线程多法、join,detach一、范例演示线程运行的开始程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释】创建

2020-05-13 09:56:44 11389 10

原创 C++11并发与多线程笔记(1) 并发基本概念及实现,进程、线程基本概念

一 并发基本概念及实现,进程、线程基本概念一、并发、进程、线程的基本概念和综述并发,线程,进程要求必须掌握1.1 并发两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务;以往计算机,单核cpu(中央处理器):某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所谓的“任务切换”。并发的假象(不是真正的并发),切换(上下文切换)时要保存变量的状态、执行进度等,存在时间开销;随着硬件发展,出现了多处理器计算机:用于服务器和高性能计算领域。台式机:在一块芯片上有

2020-05-13 09:49:20 12487 1

原创 socket编程学习笔记(2)

TCP客户/服务器模型struct sockaddr是一个通用地址,如果用ipv4,需要将ipv4的地址结构struct sockaddr_in强制转换为通用的地址结构套接字一旦传递给listen,就变成了被动套接字。主动套接字会调用connect()函数发起连接,被动套接字会调用accept()函数接受连接。write() 的原型为:ssize_t write(int fd, const void *buf, size_t nbytes);fd 为要写入的文件的描述符,b..

2020-05-09 20:57:12 262

原创 socket编程学习笔记(1)

大端字节序就是在内存中先存储数字的高位,这样数字的高位就存储在了内存的低地址处,小端字节序就是在内存中先存储数字的低位。socket可以实现异构系统间通信,不同的硬件平台对整数的存放形式是不一样的,有的采用大端字节序,有的采用小端字节序。这时候必须统一字节序,统一的字节序称为网络字节序,先将发送方主机上的字节序转换为网络字节序,接收方收到后再转换为自己的字节序。补充:x86或80x86是intel首先开发制造的一种微处理器体系结构的泛称,而基于这种微处理器体系结构搭建起来的硬件平台就成为x...

2020-05-09 20:39:22 323

原创 gcc和Makefile

makefile的作用就是帮助我们便捷的编译。掌握makefile首先要略懂gcc编译的一些简单指令gcc的编译选项可以记做 ESc(很像我们的离开键)1.预处理,生成预编译文件(i.文件): gcc –E hello.c –o hello.i2.编译,生成汇编代码(.s文件): gcc –S hello.i –o hello.s3.汇编,生成目标文件(.o文件): gcc –c hello.s –o hello.o4.链接,生成可执行文件: g

2020-05-09 20:24:02 709

原创 C++顶层const和底层const

顶层const表示对象本身是一个常量底层const表示不能通过指针或引用改变所指向的对象例如const int a = 42; //顶层const,不能改变a的值,int只能有顶层const//--------------------------指针------------------------------int b = 12;const int* b1 = &b; //底层...

2020-05-02 01:35:52 216

原创 5G 到底是什么?

0G:军事上,在两个军事据点上利用AM和FM两个波段传输语音信号1G (1980-1990) 代表产品是大哥大,是模拟信号,很容易被窃听2G(1990-2000):开始传送数字信号,可以加密和实现全球漫游,支持短信2.5G :GPRS技术2.75G:EDGE技术,可以收发邮件,浏览简单网页,聊QQ,发彩信3G (2000-2010):带动移动互联网兴起,苹果,安卓系统,微博,微信,支...

2020-05-01 22:15:37 381

原创 下沉市场模式解析

定义:五环以外的市场,以及三线城市和三线城市以下的市场。特点:人口基数大(国内超过十亿)例子:1. 拼多多,创立三年上市,市值和京东相仿;2. 趣头条,创立两年零三月上市;3.快手,估值超过200亿刀 4.水滴筹,估值超过10亿 5.云集(赚钱模式是拉下线,下线购物和销售自己能拿到佣金的百分之10)第一个挑战:现在了解市场不再是通过人的经验,而是通过人工智能和数据分析第二个挑战:自己不一定...

2020-05-01 22:12:39 2991

转载 c++实现最大堆和最小堆

原文地址添加链接描述本文加了一点点补充堆是具有以下特性的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,叫做最大堆;每个结点的值都小于或等于其左右孩子结点的值,叫做最小堆。一、建堆vector<int> nums = {9, 6, 2, 4, 7, 0, 1, 8, 3, 5};1、如果使用nums构建最大堆:make_heap(nums.begin(), nu...

2020-03-12 02:44:55 2183 1

原创 C++string的substr操作需要注意的地方

s.substr(pos,n)返回一个string,包含s中从pos开始的n个字符的拷贝。pos的默认值为0,n的默认值为s.size()-pos,即拷贝从pos开始的所有字符。需要注意的是pos不能越界,pos+n可以越界。如果开始位置pos超过了string的大小,则substr函数会抛出一个out_of_range异常。如果开始位置pos加上计数值n大于string的大小,则substr...

2020-03-11 22:40:33 1295

原创 矩阵伪逆的opencv实现

1、矩阵的逆定义:设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=I。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。可逆条件:A是可逆矩阵的充分必要条件是,即可逆矩阵就是非奇异矩阵。(当 时,A称为奇异矩阵)性质:-矩阵A可逆的充要条件是A的行列式不等于0。-可逆矩阵一定是方阵。-如果矩阵A是可逆的,A的逆矩阵是唯一的。-可逆矩阵也被称为非奇...

2019-12-06 09:57:01 922

原创 分水岭算法及其实现

1 - 算法描述1.1 分水岭算法的原理  分水岭的概念是以三维方式来形象化一幅图像为基础的:两个空间坐标再加上强度。在这种“地形学”解释中,考虑三种类型的点:(a)局部最小值点,该点对应一个盆地的最低点,当我们在盆地里滴一滴水的时候,由于重力作用,水最终会汇聚到该点。注意:可能存在一个最小值面,该平面内的都是最小值点。(b)盆地的其它位置点,该位置滴的水滴会汇聚到局部最小点。(c)盆地的边缘...

2019-08-13 19:04:17 7739

原创 Canny算子c++实现

数字图像处理作业,实现一个canny算子,这里只给出代码,opencv版本为3.4.5#include <iostream>#include "opencv2/opencv.hpp"using namespace std;using namespace cv;/*生成高斯卷积核 kernel*/void Gaussian_kernel(int kernel_size...

2019-05-28 22:05:58 1463 1

原创 C++实现均值滤波器和中值滤波器

C++实现均值滤波器和中值滤波器数字图像处理课作业,代码实现均值滤波器和中值滤波器由于中值滤波器是非线性滤波,不是卷积,所以均值和中值滤波分开实现。这里只给出代码,opencv版本为3.4.5my_convolution.h#ifndef MY_CONVOLUTION#define MY_CONVOLUTION#include <opencv2/opencv.hpp>...

2019-05-28 21:55:11 2185

转载 分布式和集中式的版本控制的区别

前面提到,Linus一直痛恨CVS及SVN这些集中式的版本控制系统,为什么呢?Git是分布式版本控制系统,那么集中式和分布式版本控制系统又有什么区别呢?先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始...

2018-08-20 17:55:06 1468

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除