![](https://img-blog.csdnimg.cn/20190910171521187.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 56
HW140701
这个作者很懒,什么都没留下…
展开
-
C++ - 跨平台在Windows、Linux系统上获取当前可执行程序路径
跨平台获取当前可执行程序路径是C++跨平台项目中会经常使用的功能,我将这个功能简单的封装成了一个。静态函数获取当前可执行程序路径,下面贴出了功能实现代码。工具类,在该类中通过。原创 2023-09-11 10:24:20 · 1129 阅读 · 0 评论 -
C++ - 获取std::vector中的最小值、最大值以及对应的索引
普通方法就是遍历std::vector,对vector中的值进行一一对比,找出最小值、最大值及其对应的索引,示例代码如下。原创 2023-04-11 13:50:23 · 3445 阅读 · 0 评论 -
C++ - std::string字符串格式化方法总结
我们可以使用可变参数模板+定义一个字符串格式化函数// std::string的字符串格式化函数 template < typename . . . Args > static std :: string str_format(const std :: string & format , Args . . . args) {if(!原创 2022-11-17 09:38:58 · 37475 阅读 · 2 评论 -
C++ - 使用标准库实现事件和委托,信号和槽机制
在本文中,我们对.Net的事件和委托,Qt的信号和槽进行了简单的介绍,然后通过引入Duilib中对于事件和委托的简单实现,进而扩展了自定义的简单事件类Event,此类实现的比较简单,但是包含了事件实践的核心思想,自己对于模板类,以及变参模板的使用又有了新的体会。原创 2022-11-02 10:41:11 · 1752 阅读 · 0 评论 -
C++ - single header跨平台高效开源日志库Easylogging++的配置和使用
Easylogging++是一个只有单个头文件的开源跨平台日志库,拥有简单易集成,速度极快,线程安全,高效并可配置可扩展等等优点,现在也是我的主力日志库。原创 2022-10-26 14:51:14 · 1098 阅读 · 1 评论 -
C++ - 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳
1 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳1.1 当前时间戳获取方法先使用std::chrono获取当前系统时间,然后将当前系统时间转换为纪元时间std::time_t类型,之后使用std::localtime对std::time_t类型转换为本地时间结构体std::tm类型,最后使用strftime对时间进行格式化输出。其中std::tm该结构包含了一个被分解为以下各部分的日历时间struct tm { int tm_sec; // 秒,范围从原创 2022-05-27 14:41:37 · 19810 阅读 · 6 评论 -
C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原
1 视频中的旋转信息以及为什么会有旋转信息Android或者ios等手机上录制视频时,由于重力感应或者录制视频的摆放方式的问题会导致录制的视频拥有旋转信息。如果是横屏录制(手机逆时针旋转90度),则录制的视频时不带角度的。如果是竖屏录制(正常的拿手机的姿势),此时的录制的视频的旋转角度是90度。如果再旋转90度,此时一般音量键和关屏键朝下,此时的视频的旋转角度是180。以此类推。所以在手机上的视频一般会有4种角度的视频,播放时,要对视频资源进行旋转后再进行播放,不然视频就会出现各种反转、倾倒。在http原创 2021-12-07 10:35:10 · 1552 阅读 · 0 评论 -
C++11 - 构建一个符合实际应用要求的线程池
1 什么是线程池线程池从本质上可以看做是一个多生产者多消费者的多线程应用。一个线程池包括以下四个基本组成部分:线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新的工作线程,添加工作任务;工作线程:属于线程池中的线程,用于处理实际任务,在没有工作任务时等待,在任务队列不为空时主动获取任务并处理任务;任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行;工作任务队列:用于存放需要处理的工作任务,采用先进先出机制;线程池根据机器性能预先创建多个工作线程,位于主线程的线原创 2021-11-08 14:58:19 · 586 阅读 · 0 评论 -
C++ - 函数返回多个返回值的方法总结
1 C++函数如何像python一样返回多个返回值使用过python的童鞋都知道,在python单个函数中可以返回多个函数值,比如:# -*- coding: utf-8 -*-def return_muliti_value(): return 1,'helloworld',[1,2,3]if __name__ == '__main__': a,b,c = return_muliti_value() print(a) print(b) print(c)原创 2021-10-13 11:33:13 · 41156 阅读 · 4 评论 -
C++ - 判断本机文件是否存在的方式总结
C++ - 判断本机文件是否存在的方式总结由于C++没有像python那样方便的os.path官方库,经常面临着判断一个文件是否在本机上存在都不易用,今天就总结下C++下判断本机文件是否存在的一些方法。1 通用方法1.1 使用std::ifstream判断#include <iostream>#include <fstream>bool Is_File_Exist(const std::string& file_path){ std::ifstream fi原创 2021-09-15 14:25:20 · 3563 阅读 · 0 评论 -
C++11 - 委托机制的实现TinyDelegate
1 使用C++11实现委托机制1.1 TinyDelegate类1.1.1 代码TinyDelegate.hpp#ifndef TINY_DELEGATE_H#define TINY_DELEGATE_H#include <functional>#include <chrono>#include <string>#include <list>#include<algorithm>template<typename原创 2021-09-09 17:03:01 · 251 阅读 · 0 评论 -
C++ - std::map正向遍历与反向遍历的几种方式
1 std::map正向遍历1.1 for循环#include <iostream>#include <string>#include <map>int main(){ std::map<int, std::string> t_Map; t_Map[0] = "A"; t_Map[1] = "B"; t_Map[2] = "C"; std::map<int, std::string>::iterator iter1; f原创 2021-05-21 14:13:38 · 8571 阅读 · 0 评论 -
C++11 - 使用std::thread::join()/std::thread::detach()方法需要注意的点
1 调用std::thread::join()方法等待线程退出时的示例问题程序#include <iostream>#include "conio.h"#include <memory>#include <thread>#include <atomic>class BaseThread{public: typedef std::shared_ptr<BaseThread> ptr; BaseThread() { m_原创 2021-02-26 15:02:51 · 2597 阅读 · 0 评论 -
C++11 - std::chrono - 使用std::chrono::duration_cast进行时间转换
1 小时转换为分钟/秒/毫秒/微秒#include <iostream>#include <string>#include <chrono>int main(){ std::chrono::hours hour_time = std::chrono::hours(1); std::chrono::minutes minutes_time = std::chrono::duration_cast<std::chrono::minutes>(h原创 2021-02-05 11:20:25 · 11087 阅读 · 0 评论 -
C++11 - 使用std::chrono计算程序、函数运行时间
1 使用std::chrono计算程序运行时间参考代码如下:#include <iostream>#include <string>#include <chrono>void Run(){ for (int i = 0; i < 1000000000; ++i) { }}int main(){ auto beforeTime = std::chrono::steady_clock::now(); Run(); auto a原创 2021-02-05 09:39:13 · 11447 阅读 · 4 评论 -
C++ - 线程安全的std::cout
1 线程安全的std::cout最近在多个子线程中使用std::cout输出日志信息发现std::cout不是线程安全的,无法保持线程同步,导致日志信息无法按照固定顺序输出,如下:所以对std::cout做了一个封装以保证多线程之间的同步,代码如下:#include <iostream>#include <string>#include <mutex>namespace ThreadSafePrint{ static std::mutex m_Cou原创 2021-02-01 11:38:54 · 3564 阅读 · 0 评论 -
C++11 - std::string - stod/stof/stoi/stol/stold/stoll/stoul/stoull
文章目录1 std::stod2 std::stof3 std::stoi4 std::stol5 std::stold6 std::stoll7 std::stoul8 std::stoull在C++11发布之前我们只能使用C语言的atoi等函数完成字符串到int/float/double等类型的转换,而在C++11中在std::string中自带了stoi/stod等工具函数进行转换!1 std::stod函数原型double stod (const string& str,原创 2021-01-29 11:01:24 · 2975 阅读 · 0 评论 -
Centos7 编译C++项目错误解决 : terminate called after throwing an instance of ‘std::regex_error‘
文章目录1 问题原因2 解决方法3 Centos7升级gcc3.1 安装centos-release-scl3.2 安装devtoolset3.3 激活对应的devtoolset3.4 验证gcc版本3.5 新安装的gcc/g++路径3.6 新建软链接替换旧的gcc4 Cmake指定编译器为新安装的gcc版本5 参考链接1 问题原因Centos7默认的gcc版本是4.8.3,虽然对C++11的一些新特性提供了支持,但是对C++11的正则表达式好像只写了头文件,没有提供具体的实现????!Wtf!因为在原创 2020-12-16 14:30:47 · 7715 阅读 · 7 评论 -
C++ 11 - final关键字简要介绍
如果在基类的虚函数声明中加上了final关键字,则表明后续的派生类不能重写该函数。1 基类的虚函数上加上final关键字表明基类后续的派生类不能重写该虚函数。代码示例:#include <iostream>#include <memory>using namespace std;class Shape{public: virtual void Area() final { std::cout &.原创 2020-10-12 17:20:57 · 680 阅读 · 1 评论 -
C++11 - override关键字简要介绍
C++11 中的 override 关键字,可以显式的在派生类中声明,基类的哪些函数需要被重写,如果没被重写,则编译器会报错。防止出现在需要调用派生类某个成员函数的情况下错误的调用了基类的缺省函数实现。1 派生类对基类中的函数继承派生类对基类中的函数继承可以分为几种类型:接口继承,通过在基类中声明纯虚函数实现接口+缺省实现,通过在基类中声明普通虚函数实现,派生类可以声明同名的虚函数覆盖基类中的缺省实现,以实现自己的个性化接口+强制实现,通过在基类中声明一个非虚函数实现1.1 接口继承通常.原创 2020-10-12 17:08:34 · 1647 阅读 · 0 评论 -
C++11 - 父类与子类相互包含的时候该如何正确的使用智能指针,防止循环引用
1 父类和子类相互包含的应用场景在实际开发的过程中,经常会遇到这种类似的问题,一个父类通常维护着属于该父类的多个子类指针,而每一个子类中也存储着指向其父类的指针对象,方便进行节点递归或者其他操作。比如说:一个三维立方体,每一个三维立方体类都包含了所有属于该立方体的三角面类,而每一个三角面都存储着指向包含该三角面的三维立方体指针。这种父类和子类都相互存储着指向互相指针,这种情况下很容易出现循环引用而导致内存泄漏的问题,那么我们该如何正确的使用std::weak_ptr去解决这种应用场景的问题呢?2原创 2020-09-25 11:19:37 · 908 阅读 · 0 评论 -
C++11 - std::bind简要介绍以及可绑定函数的几种形式总结
1 std::bindtemplate <class Fn, class... Args> /* unspecified */ bind (Fn&& fn, Args&&... args);template <class Ret, class Fn, class... Args> /* unspecified */ bind (Fn&& fn, Args&&... args);1.1 函数模板说明基于参数f原创 2020-09-24 16:20:53 · 6852 阅读 · 2 评论 -
C++11 - std::function简要介绍以及可包装函数的几种形式总结
1 std::function函数模板形式:template <class T>函数;//未定义模板<class Ret,class ... Args> class function <Ret(Args ...)>;1.1 函数模板说明std::function是一个函数包装器模板,该函数包装器模板可以包装任意可以调用的元素,其包装器的类型只依赖于其调用特征,而不依赖于可调用元素自身的类型。std::function可包装下列可调用元素类型:函数函数指原创 2020-09-24 16:09:28 · 2993 阅读 · 0 评论 -
C++ - 使用Websocket++编写客户端连接WebSocket服务器并进行通信
1 库依赖Websocket++/Websocketpp依赖于boost(使用boost 1.74),Websocket++ 0.8.2版本,因为暂时没有使用wss,所以没有集成Openssl。2 根据官方示例代码修改封装的WebsocketClient类2.1 WebsocketClient代码WebsocketClient.h#ifndef WEBSOCKET_CLIENT_H#define WEBSOCKET_CLIENT_H// 不包含TLS Client#include &l原创 2020-08-31 17:46:32 · 11331 阅读 · 6 评论 -
支持C++11特性的定时器 - TinyTimer
1 基于C++11特性的微小定时器 - TinyTimer只包含一个头文件的基于C++11特性的微小定时器实现类 -TinyTimer,支持支持同步/异步执行定时器任务;支持中途中断定时器任务,可参考Windows Api的SetTimer和KillTimer;支持多种任务函数类型代码:TinyTimer.hpp#ifndef TINY_TIMER_H#define TINY_TIMER_H#include <functional>#include <chrono原创 2020-08-26 17:03:55 · 2243 阅读 · 0 评论 -
C++ - 控制台程序在控制台窗口可变参数格式化带颜色输出日志信息
1 C++以可变参数格式化带颜色输出日志信息使用Unity时,它的日志系统做的就比较好,不同类型的日志信息在底下面板以不同的颜色输出出来,简单明了,所以仿照这个做了一个简陋的,不过也够用了,代码如下:#include <iostream>#include <Windows.h>template <typename... Args>void LogError(const char* fmt, Args... args) { size_t strsize = s原创 2020-07-24 11:30:33 · 481 阅读 · 0 评论 -
C++ - queue存储动态指针时正确释放内存
1 代码示例#ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#include <crtdbg.h>#ifdef _DEBUG#defin...原创 2020-05-06 16:30:49 · 3729 阅读 · 0 评论 -
C++ - vector存储动态指针时正确释放内存
1 代码示例#ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#include <crtdbg.h>#ifdef _DEBUG#defi...原创 2020-05-06 16:10:02 · 3231 阅读 · 0 评论 -
C++11 - 基于无锁队列的单生产者单消费者模型
1 单生产者单消费者无锁队列Github项目地址:https://github.com/cameron314/readerwriterqueue2 多生产者多消费者无锁队列另外这个作者还搞了一个并发的无锁队列,Github地址:https://github.com/cameron314/concurrentqueue3 单生产者单消费者无锁模型基于第一个项目的readerwrite...原创 2020-04-22 13:43:21 · 3562 阅读 · 0 评论 -
C++11/std::shared_ptr - 循环引用问题
在C++11智能指针的使用过程中,一个很大的陷阱就是陷入了循环引用问题,这个问题类似于大型项目中两个头文件互相包含的问题,而在C++11中如果因为使用智能指针而引发了循环引用问题,那么其结果会导致智能指针无法释放,导致动态内存泄漏。下面是一个典型的循环引用示例:class B;class A {public: std::shared_ptr<B> pointer_B;...原创 2020-04-02 17:22:22 · 1281 阅读 · 0 评论 -
C++11/std::atomic - 原子变量(不加锁实现线程互斥)
1 原子操作原子操作:一个独立不可分割的操作。多线程编程需要保证线程安全,而线程安全一个很重要的特性就是原子性,即在同一时刻只有一个线程对原子进行操作,保证数据访问的互斥性。2 C++11原子变量C++11提供了原子类型std::atomic,可以使用任意的类型作为模板参数。在多线程中如果使用了原子变量,其本身就保证了数据访问的互斥性,所以不需要使用互斥量来保护该变量了。3 使用原子变量...原创 2020-04-02 13:31:25 · 12088 阅读 · 8 评论 -
C++11/std::condition_variable - 生产者消费者模型
代码示例:#include <iostream> #include <thread> #include <chrono> #include <mutex>#include <deque>#include <condition_variable>std::deq...原创 2020-04-01 17:45:25 · 578 阅读 · 0 评论 -
C++11/std::thread - 线程的基本用法
1 获取CPU核心数量使用std::thread::hardware_concurrency()获取当前CPU核心数量。代码示例:#include <iostream>#include <thread>int main(){ std::cout << std::thread::hardware_concurrency() <<...原创 2020-04-01 11:59:20 · 1184 阅读 · 0 评论 -
C++11/std::thread - 线程管理join/detach
1 join方法代码示例:#include <iostream>#include <thread>void HelloWorld(){ std::cout << "hello world" << std::endl;}int main(){ std::thread helloWorldThread(HelloWor...原创 2020-04-01 11:46:11 · 1176 阅读 · 0 评论 -
C++11/std::thread - 可作为线程函数的几种方式总结
1 使用普通的函数作为线程函数代码示例:#include <iostream>#include <thread>void ThreadFunction(){ std::cout<< "线程函数被启动" << std::endl;}int main(){ std::thread thread(ThreadFunct...原创 2020-04-01 10:45:15 · 3199 阅读 · 0 评论 -
Win7 64位下让VC++6.0编写的Win32程序单进程运行内存突破2G
最近在调试一个大型的MFC程序的时候,需要在Cview类中申请一个double(float)array[2100][400][500]的三维数组,首先声明一点,算法比较复杂,暂时没有办法去修改算法,所以必须要申请一个这么大的三维数组空间。(1)首先在栈中申请了一个固定数组array[2100][400][500],结果VC提示超出栈的保留空间了。这种方法OUT(2)然后用std::vect...原创 2016-08-06 18:08:40 · 4928 阅读 · 0 评论 -
MFC 用进度条在状态栏显示某个按钮响应函数的过程,并用多线程实时更新
因为写的一个按钮的响应函数在数据量大的情况下会出现未响应的情况,所以为了让人直观的可以觉得程序仍然还在运行,并实时显示函数的运行状态。(1)首先MFC工程中新建一个类,这个类不是MFC类而是Generic Class,在类视图下,添加一个新类,并选择Generic Class,将这个类命名为CProgressStatusBar,设置其基类为CStatusBar(2)在资源视图,字串...原创 2016-09-01 21:19:28 · 4937 阅读 · 2 评论 -
VC消息大全
VC消息大全hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。lParam 通常是一个指向内存中数据的指针。由于W转载 2016-04-11 14:06:57 · 588 阅读 · 0 评论 -
将三维地理坐标转换到二维屏幕坐标
如何将三维地理坐标如(388691,4103865,4300)的(X,Y,Z)类型的坐标转化为在视口中能够被看见的地理坐标,在OpenGL中虽然可以转化,但是通过缩放之类的操作之后并没有成功,还是将图形或者点画在视口的范围之外,在屏幕视口中看不到。在网上搜寻之后,得到如下的方法;方法一:中心点配对法:即视图中心与地理空间中心点匹配,根据给定的地理坐标,计算该点与视野中心点的偏移和比例来进行...原创 2016-03-30 17:04:28 · 10552 阅读 · 1 评论 -
VTK能干什么?VTK大部分功能的细节简介,VTK能打开的文件格式
VTK的范例程序网址:http://www.vtk.org/Wiki/VTK/Examples/Cxx上面用提供了C++/TCL还有Java的大量的关于VTK的范例程序,详尽的描述了VTK到底能做哪些事情,涵盖 了VTK大部分强大的功能。VTK不仅能对序列的医学图像进行三维重建,比如说面绘制MC算法,体绘制的光线投影算法,还有诸多其他的有用的功能,涵盖普通的几何点、线、多边形以及图像数据。以下...原创 2016-09-04 11:15:48 · 9092 阅读 · 11 评论