
C++
文章平均质量分 78
Pafey
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Deepseek】Windows MFC/Win32 常用核心 API 汇总
掌握常用的API函数是Windows MFC/Win32开发的基础。我为你整理了50个核心且常用的API,并尽力确保了信息的准确性。下面是一个汇总表格,方便你快速了解:🧭 学习和使用建议掌握这些API是Windows编程的基础。除了查阅表格,你还可以:⚠️ 重要提醒这些API是构建Windows应用程序的基石,希望这份列表能对你的学习和开发有所帮助。如果你对某个特定类别(如网络编程、注册表操作等)的API有更深入的兴趣,我可以提供更针对性的信息。原创 2025-08-28 09:42:11 · 362 阅读 · 0 评论 -
设计模式七大原则附C++正反例源码
一个类应该只有一个引起它变化的原因(即一个类只负责一项职责)。原创 2025-08-26 10:48:17 · 513 阅读 · 0 评论 -
设计模式七大原则
本文介绍了面向对象设计的五大核心原则:1)开闭原则(OCP)强调通过扩展而非修改来增强功能,以迪迦奥特曼类为例展示了抽象类与继承的实现方式;2)单一职责原则(SRP)要求每个类只承担一个功能;3)依赖倒置原则(DIP)提倡面向接口编程,以电脑组装为例说明组件与主机通过抽象接口解耦;4)接口隔离原则(ISP)主张功能接口的单一性;5)里氏替换原则(LSP)指出子类应能完全替代父类。这些原则共同构成了可扩展、低耦合的软件设计基础。转载 2025-08-22 17:55:38 · 26 阅读 · 0 评论 -
C++ 常见的排序算法详解
排序算法综述 本文系统梳理了常见的排序算法,包括冒泡、选择、插入等比较类排序,以及计数、桶排等非比较类排序。文章从核心思想、实现步骤、复杂度分析等方面详细剖析了每种算法,并提供了C++代码实现。重点分析了各算法的优缺点和适用场景:冒泡排序简单但效率低;选择排序交换次数少但不稳定;插入排序适合小规模数据;希尔排序通过分组提高效率;归并排序采用分治法实现稳定排序。文章强调深入理解排序算法对编程思维和性能优化的重要性,为开发者提供了全面的排序算法参考指南。原创 2025-08-21 17:48:38 · 740 阅读 · 0 评论 -
23 种设计模式的通俗解释与简单示例(C++不同版本实现)
设计模式是前辈们总结的代码设计经验,目的是让代码更灵活、可复用、易维护。对于新手来说,可以先理解“什么时候用”,再掌握“怎么实现”。下面用通俗易懂的方式讲解23种设计模式,每种都附C++示例(兼顾C++11及以后的现代写法)。通俗解释:一个类只能创建一个对象(比如全局配置、日志器),像国家只有一个总统。核心:私有化构造函数,通过静态方法返回唯一实例。实现1:饿汉式(C++98)(程序启动就创建实例,线程安全,但可能浪费内存)实现2:懒汉式(C++11,线程安全)(用到时才创建,节省内存,C++11静原创 2025-07-30 14:18:51 · 670 阅读 · 0 评论 -
移动语义和右值引用有什么关系?
C++11引入的右值引用和移动语义是提升程序性能的关键特性。右值引用(&&)通过绑定临时对象标识"可移动资源",而移动语义利用这一机制实现高效资源转移,避免不必要的深拷贝。两者紧密关联:右值引用为移动语义提供语法基础,移动语义则是右值引用的核心应用场景。通过std::move可将左值转为右值引用,触发移动构造或移动赋值操作,实现资源所有权的高效转移。这种机制显著优化了大型对象和资源管理的性能。原创 2025-07-29 17:12:29 · 365 阅读 · 0 评论 -
如何理解C++11引入的移动语义和它解决的“深拷贝”问题
以的push_back为例:当你把一个vector A插入到另一个vector B中(),默认情况下会发生深拷贝——即复制A中所有元素到B的新内存空间。问题:如果A中的数据量大(比如100万个元素),深拷贝会消耗大量内存和CPU时间,效率很低。更糟的是:如果A之后不再使用,这份拷贝就成了“无用功”,浪费资源。移动语义通过std::move实现了“资源所有权转移”,避免了不必要的深拷贝,尤其适合处理等“包含大块资源”的对象,能显著提升程序性能(减少内存占用和复制开销)。“与其复制,不如转交”原创 2025-07-29 16:47:05 · 168 阅读 · 0 评论 -
设计模式:单例模式
单例模式原创 2025-04-10 15:49:39 · 766 阅读 · 0 评论 -
lambda 表达式详解
lambda表达式是C++中非常强大和灵活的特性,它可以简化代码,提高代码的可读性和可维护性。通过合理使用捕获列表和参数列表,你可以在需要的地方快速定义匿名函数。// 使用lambda表达式作为比较函数,按降序排序});return 0;在这个例子中,std::sort需要一个比较函数来确定元素的排序顺序,我们使用lambda表达式简洁地定义了这个比较逻辑。原创 2025-02-06 17:59:37 · 1112 阅读 · 0 评论 -
线程同步时定义 std::mutex 为什么要在前面添加 mutable 关键字
在C++中,关键字用于修饰类的成员变量,表示即使在一个对象中,该成员变量也可以被修改。对于这样的同步原语,使用是必要的,原因如下:通常用于保护类的内部状态,即使在成员函数中,也可能需要加锁来保证线程安全。例如:成员函数的语义:成员函数承诺不会修改对象的状态。的特殊性:本身的状态(如锁的状态)需要被修改,但这并不影响对象的逻辑状态。使用:将声明为,可以在成员函数中修改它,而不会违反的语义。2. 如果不使用 会怎样?如果没有声明为,在成员函数中尝试加锁会导致编译错误:编译器会报错,因为会尝试原创 2025-02-05 17:22:26 · 576 阅读 · 0 评论 -
实现一个 LRU 风格的缓存类
类似于Windows系统的 win 菜单最近打开功能模块,使用最近最少使用(LRU)的缓存淘汰策略,缓存可以设置最大容量。可以通过维护一个指向每个键在列表中位置的映射,将这一操作的时间复杂度优化到。的操作可能会抛出异常(如内存分配失败),可以考虑添加异常处理机制,让代码在异常情况下能有更好的表现。方法中都有将键移到列表末尾的操作,可以将这一操作提取成一个单独的方法,提高代码的复用性。put:新增或者更新缓存,当容量已满时,删除最早的数据,再插入。参数的检查,避免传入不合法的值(如负数),增强代码的健壮性。原创 2025-02-05 15:04:06 · 1350 阅读 · 0 评论 -
缓存类为啥使用 unordered_map 而不是 map
【代码】缓存类为啥使用 unordered_map 而不是 map。原创 2025-02-05 10:37:42 · 1030 阅读 · 0 评论 -
C++ 容器对比汇总 vector deque list forward_list map set multimap unordered_map
【代码】C++ 容器 vector deque list forward_list map set multimap unordered_map 等访问插入性能内存特点存储结构适用场景区别汇总。原创 2025-01-13 17:38:56 · 1084 阅读 · 0 评论 -
时间复杂度简介
Ofn)ncn0n≥n0fn≤c⋅gn)Ogn))fn3n5nOn)n3n5n35O11)On)nnnOn)Ologn)nlog2nOlogn)On2)nnn−1n−ii2nn−1On2)On3)On2)O2n)FnFn−1Fn−2)F00F11Fn)Fn−1)Fn−2)O2n。原创 2025-01-10 17:44:41 · 902 阅读 · 0 评论 -
异或算法(XOR encryption)对字符串进行加密和解密
【代码】异或算法(XOR encryption)对字符串进行加密和解密。原创 2024-12-24 14:41:45 · 277 阅读 · 0 评论 -
一个简单的基于Qt的MVC框架
这个示例展示了如何使用Qt搭建一个简单的MVC框架,其中模型中的操作在子线程中处理。你可以根据需要扩展这个框架,添加更多的功能和复杂性。希望这个示例对你有帮助!原创 2024-07-11 17:10:01 · 1396 阅读 · 4 评论 -
重编译 microsip 和 pjsip 支持 mp3 录音
使用 MicroSip 源码编译后,在录音配置界面虽然有 mp3 格式选项,但是实际录音后不会生成mp3 文件夹,而选择wav格式却可以正常生成 wav 文件。经测试发现需要重新编译 pjsip 工程,加入 mp3 编码才可以。.........原创 2022-07-28 18:57:46 · 1522 阅读 · 0 评论 -
Unicode 和 UTF8 互转
亲测可用,备份留用。C++/MFC UTF8 转 Unicodechar* U8ToUnicode(char* szU8){ //UTF8 to Unicode //预转换,得到所需空间的大小 int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);...原创 2014-11-09 00:31:03 · 791 阅读 · 0 评论 -
MFC 通过 http (post/get) 访问WEB(接口)服务器,并取得服务器返回数据
关键系统函数CHttpConnection* CInternetSession::GetHttpConnectionCHttpFile* CHttpConnection::OpenRequestCHttpFile::SendRequestCInternetFile::Read访问接口函数//strMethod:类型包含 POST/GET ,strUrl访问的网址,strPos...原创 2018-06-12 16:17:11 · 9281 阅读 · 7 评论 -
c++Primer5--如何选择类型
和c语言一样,c++的设计准则之一也是尽可能地接近硬件。C++的算术类型必须满足各种硬件特征,所以它们常常显得繁杂而令人不知所措。事实上,大多数程序员能够(也应该)对数据类型的使用做出限定从而简化选择的过程。以下是选择类型的一些经验准则:当明确知晓数值不可能为负时,选用无符号类型。使用int执行整数运算。在实际应用中,short常常显示太小而 long 一般和 int 有一样的原创 2017-03-07 23:36:49 · 297 阅读 · 0 评论 -
vs2015 dll 消息传递字符串方法(string 异常)
同样的代码在 vs2008 的dll中,用 string 可以传递。换到 vs2015 中就异常,原因可能涉及到 STL 不同模块下内存释冲突问题,很是头大。用char* 的话内存申请和释放又很麻烦。改为使用 char 数组形式可以替代。如下 ... if (NULL != g_hWndCIO) { char buf[512] = {0}; sprintf_s(buf, "%s",...原创 2019-02-27 17:09:00 · 928 阅读 · 0 评论 -
C++ 资源大全
转自:原文链接关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。 标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Templat转载 2016-05-31 15:01:31 · 577 阅读 · 0 评论 -
Log4Cpp 使用实例
Log4Cpp 的概念及简介自行百度,网络上已经很齐全了。下载编译呼,得到了log4cpp.dll 和 log4cpp.lib 以及 include 头文件等内容。封装了个Log4Cpp的使用类,输出的效果如下:[2017-02-20 16:09:51.910](NOTICE)Sys : 进入了CPfy_log4cppDlg::OnBnClickedButton1函数[2017-原创 2017-02-20 18:21:10 · 3641 阅读 · 1 评论 -
获取汉字首拼函数(据说该方法来自BCB函数库)
之前项目有个需求是要支持拼音搜索姓名,那么首先得保持姓名的首拼字母,那么字母获取汉字的首拼呢?经过网络搜索及测试,发现有个方法比较靠谱,据说是BCB的函数库,反正里面的实现原理是看得头疼,至今未解。std::string ConvertHZToPY( const char* strChs ){ static int li_SecPosValue[] = { 1601, 1637原创 2017-03-02 18:19:37 · 971 阅读 · 0 评论 -
QT 下 SQlite3 数据库加密及 CppSQLite3 操作数据库加密
由于最近项目需要考虑本地数据的安全性,避免谁都可以找到数据库文件然后右键-记事本打开。。。所以研究了下SQLite3本地数据库加密的方法,百度之,有两种,一是加密数据后存入数据库,二是整个加密数据库;如果选一改地方实在太多,所以一直找直接加密sqlite数据库的方法;然后各种搜索,整合后可行的方式是使用sqlite预留的加密接口,具体编码是用wxsqlite的加密模块;1.原创 2016-07-15 10:10:25 · 10256 阅读 · 2 评论 -
C++Primer笔记--vector 对象 string 对象的下标操作警告
vector 对象以及 string 对象的下标运算符可用于访问已存在的元素,而不能用于添加元素。vector ivec;for(decltype(ivec.size()) ix = 0; ix != 10; ++ix) ivec[ix] = ix;//严重错误:ivec 不包含任何元素 ivec 是一个空 vector,根本不包含任何元素,当然也就不能通过下标去访问任何元素了,正原创 2017-03-22 00:09:05 · 699 阅读 · 0 评论 -
C++Primer笔记--变量和基本类型
符合类型的声明一条定义语句可能定义出不同类型的变量:// i 是一个 int 型的数,p 是一个 int 型指针,r 是一个int 型引用int i = 1024, *p = &i, &r = i;错误观点:在定义语句中,类型修饰符(*或&)作用于本次定义的全部变量。造成这种错误看法的有个原因就是我们可以把空格写在类型修饰符和变量名中间:int* p; //合法,但原创 2017-03-15 00:26:50 · 342 阅读 · 0 评论 -
C++Primer5 笔记--迭代器运算
vector 和 string 迭代器支持的运算iter + niter - n迭代器加上或减去一个整数值仍得到一个迭代器,迭代器指示的新位置与原来相比向前/向后移动了若干个元素。iter1 += n迭代器加法的复合赋值语句,将 iter1 加上 n 的结果赋给 iter1iter1 -= n同加法相同理解iter1 - iter2 两个迭代器原创 2017-03-25 23:05:57 · 1068 阅读 · 0 评论 -
C++Primer笔记--数组
字符数组的特殊性可以用字符串字面值来初始化,当使用这种方式时,一定要注意字符串字面值结尾处还有一个空字符‘\0’。在分配内存空间时需要多为空字符预留一个字符空间。数组不允许拷贝和赋值int a[] = {0,1,2};int a2[] = a;//错误a2 = a;//错误有些编译器支持数组的赋值,这就是所谓的编译器扩展(compiler extension)。但一般来说,原创 2017-03-26 23:40:44 · 324 阅读 · 0 评论 -
Qt 中实现 hmac Sha1 加密并以 base64编码输出
#include QString hmacSha1(QByteArray key, QByteArray baseString){ int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard if (key.length() > blockSize) { // if key is longer than b转载 2017-06-22 11:00:57 · 3249 阅读 · 1 评论 -
SQLite 3 特定需求语句
1.以某个字段结果的长度大小来排序,示例:用于模糊匹配关键字,优先匹配吻合度高的SELECT * FROM "REQ_ANS_DATA" WHERE name like '%.spec' ORDER BY length(CONDITION) DESC;2.某列结果去重复-DISTINCTSELECT DISTINCT ANSWER FROM "REQ_ANS_DATA" WHERE name li原创 2018-01-02 16:41:48 · 468 阅读 · 0 评论 -
dll导出类比较好的方式
看了篇好文,dll导出类的,之前已经胡乱写,以后可以参考这个规范前言/引用转自:编写DLL所学所思(2)——导出类 参考:HowTo: Export C++ classes from a DLL这种方式是比较合适的,跟com类似。结构是这样的: 导出类是一个派生类,派生自一个抽象类——都是纯虚函数。使用者需要知道这个抽象类的结构。DLL最少只需要提供一个用于获取类对象指...原创 2018-03-20 16:56:15 · 5913 阅读 · 6 评论 -
回调函数的别样理解
对回调函数一知半解,找了些文章看看,可能是我悟性太差吧,看不打明白,或者有些写的就不够通俗易懂. 直到遇到这篇07年的老文,原来到处是回调啊.http://blog.csdn.net/tingsking18/article/details/1509224另外有个发现,零几年的文章往往质量比较优质,现在的很多文章往往觉得很浅 是我们太浮躁,急功近利了么?...原创 2018-03-22 10:05:49 · 179 阅读 · 0 评论 -
电脑通过 adb 控制安卓手机(1台或多台)自动加微信
最近做了个需求,从电脑上通过数据线控制手机打电话和自动添加微信好友。查找一番,很快有了方向,那就是通过 adb工具,即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备(也就是手机)交互。好了,知道用什么就好整了,下面简单介绍下过程1.下载adb工具adb 官网下载:http://adbshell.com/u...原创 2018-03-28 16:03:40 · 15279 阅读 · 9 评论 -
MFC 下载网络文件到本地 利用 CHttpFile 和 URLDownloadToFile 【可设超时及进度】两种方式
说明方法1较为简单,通用的多,但在某些环境下可能出现未知错误(也有可能你碰不到,反正我是碰到了)。 方法2实现相对麻烦点,但可设置超时时间以及进度展示,但要实例化一个LPBINDSTATUSCALLBACK 子类,在这个子类中去实现。这个相对好用点,方法1遇到的错误的情况,用方法2却可以正常使用。 LPBINDSTATUSCALLBACK 这个子类代码没有贴出来,放在文未,可点击下载。...原创 2018-06-12 16:47:39 · 4423 阅读 · 0 评论 -
MFC 上传文件函数 (利用 CHttpFile 上传 )
上传本地文件至服务器指定位置//上传本地文件至服务器指定位置BOOL UploadFile(LPCTSTR strURL, //负责接收上传操作的页面的URL LPCTSTR strLocalFileName) //待上传的本地文件路径{ ASSERT(strURL != NULL && strLocalFileName != NULL);...原创 2018-06-12 16:58:24 · 4016 阅读 · 1 评论 -
安装 emoji 字体
//安装emoji字体void InsertEmojiFont(){ CString sSourceDir =GetExePath()+_T("\\font\\");//exe路径 CString sFontFileName=_T("SEGUIEMJ.TTF"); //字体名称(将显示在字体对话框中). CString sFontName=_T("Segoe U...原创 2018-06-28 13:59:09 · 7481 阅读 · 0 评论 -
C++ TR1 正则表达式
C++ TR1 正则表达式OverviewThis article is written for the benefit of someone familiar with regular expressions but not with the use of regular expressions in C++ via the TR1 (C++ Standards Committee Tech...转载 2018-09-26 11:41:21 · 820 阅读 · 0 评论 -
VC中鼠标移动点击操作
实例: CPoint pointOld; GetCursorPos(&pointOld); CRect rect; GetDlgItem(IDCANCEL)->GetWindowRect(&rect); //要获取位置的控件ID //ScreenToClient(rect); //rect.left 就是X坐标,rect.top 就是Y坐标 SetCursorPos( rec原创 2014-12-03 11:38:53 · 3958 阅读 · 0 评论