C++ 开发技巧总结
文章平均质量分 81
介绍C++高级语法、C++ 11、多线程、线程池等技术,C++数据库操作,C++常用开发组件的使用,提供全部源码.
优惠券已抵扣
余额抵扣
还需支付
¥99.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
令狐掌门
C++程序员,出版过《C++零基础入门视频教程》、《Qt高级进阶视频教程》、《OBS源码分析与桌面录制视频教程》、《PyQt PySide6零基础入门与项目实战》。
展开
-
CMake教程:C++ CMake自定义find_package并在其它项目使用
find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。原创 2024-07-22 22:22:57 · 48 阅读 · 0 评论 -
C++如何把图片转成base64数据
在C++中将图片转换为Base64格式涉及几个步骤,主要是读取图片文件的二进制数据,然后将这些数据编码为Base64字符串。这个过程通常需要用到额外的库来辅助完成,例如使用开源库如OpenSSL来进行Base64编码,以及使用标准库来处理文件输入输出。运行程序之前,确保修改文件路径为实际图片文件的路径。这个程序将输出Base64编码的字符串,可用于网页显示或其他需要Base64编码的场景。首先,确保你的系统中安装了OpenSSL库。原创 2024-04-15 21:27:32 · 206 阅读 · 0 评论 -
C++ std::copy和copy_if用法介绍
在C++标准库中,std::copy 和 std::copy_if 是算法库的一部分,用于复制一系列元素。std::copy 函数用于将一系列元素从一个容器复制到另一个容器。这个函数在 头文件中定义。原创 2023-12-01 08:44:26 · 436 阅读 · 0 评论 -
C++ vector pair用法介绍
作者:令狐掌门技术交流QQ群:675120140。原创 2023-11-30 09:17:02 · 1138 阅读 · 0 评论 -
C++ 17实现无锁队列
在软件编程中,无锁队列是一种特殊类型的数据结构,它允许多个线程在不使用传统互斥锁(如mutexes)的情况下进行并发访问。无锁队列通过使用原子操作来确保线程安全,原子操作是一种不可中断的操作,它可以在单个步骤中完成,无需锁定资源。性能提升:无锁队列通常比使用锁的队列有更好的性能,因为它们避免了锁的开销,包括上下文切换、线程调度延迟和潜在的死锁问题。可扩展性:在多处理器系统中,无锁队列可以更好地扩展。随着处理器数量的增加,使用锁的队列可能会遇到瓶颈,因为多个线程竞争同一个锁。原创 2023-11-29 09:23:30 · 997 阅读 · 0 评论 -
尝试用C++从实现一个可用的内存池
作者:令狐掌门技术交流QQ群:675120140。原创 2023-11-29 09:22:59 · 1002 阅读 · 0 评论 -
Linux POSIX C/C++线程API介绍与代码演示
Linux POSIX API(Application Programming Interface)是一组用于编写可移植的多线程、进程间通信、文件操作等系统级应用程序的标准接口。它遵循POSIX(Portable Operating System Interface for Unix)标准,POSIX是一组定义了操作系统接口的标准,旨在提高可移植性和互操作性。Linux POSIX API提供了许多函数和数据类型,用于创建和管理线程、进程间通信、文件操作、信号处理、互斥锁、条件变量等。原创 2023-08-10 22:17:35 · 321 阅读 · 0 评论 -
Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client
Linux POSIX线程库提供了一组函数来创建、管理和同步线程。:创建一个新的线程。return 0;:等待一个线程的结束。return 0;:初始化一个互斥锁。return 0;:初始化一个条件变量。return 0;原创 2023-08-10 21:48:47 · 1495 阅读 · 0 评论 -
Linux C++网络编程基础(1):TCP服务端与客户端的实现
这两段代码分别实现了一个简单的服务器和客户端。服务器创建一个socket,绑定到一个特定的端口,并开始监听这个端口。当一个客户端连接到这个端口时,服务器接收客户端发送的消息,然后向客户端发送一个响应。在Linux环境下,我们可以使用socket编程来实现网络通信。下面是一个简单的C++版本的客户端和服务端的示例代码。这只是一个非常基础的示例,实际的网络编程可能会涉及到更复杂的情况,比如多线程或者非阻塞IO等。客户端创建一个socket,连接到服务器的特定端口,发送一个消息,然后等待服务器的响应。原创 2023-08-07 16:48:07 · 1155 阅读 · 0 评论 -
vscode ssh linux C++ 程序调试
vscode调试c++程序相比vs2022要复杂很多,vs2022可以"一键运行调试",vscode则需要自己配置。vscode调试程序时,会在当前工作目录产生.vscode目录, 该目录有两个重要文件和tasks.json, 下面介绍两种调试方法: 手动调试和自动调试。原创 2023-10-09 23:41:54 · 639 阅读 · 0 评论 -
C++实现线程安全的vector
如果你需要支持迭代器,你可能需要使用一个不同的设计,例如,你可以返回一个持有锁的“代理”对象,该对象在析构函数中释放锁。的每个操作都是线程安全的,但如果你需要进行多个操作并且这些操作需要一起原子地(atomically)完成,那么你可能需要在你的代码中添加额外的同步。如果你的应用程序需要更高的并行性,你可能需要使用更复杂的数据结构或同步策略,例如,你可以使用一个并行数据结构库,或者实现一个读写锁策略,允许多个线程同时读取vector。方法,因为在调用这两个方法之间,其他线程可能已经修改了vector。原创 2023-11-20 20:35:15 · 409 阅读 · 0 评论 -
C++实现线程安全的map
是C++17标准中引入的一种新的线程同步原语。它是一个允许多个读取者与单一写入者并发访问共享数据的互斥锁。共享锁定(Shared Locking):在共享锁定期间,其他线程可以同时获取共享锁定,但不能获取独占锁定。这通常在只读操作中使用,因为多个线程可以同时读取数据,而不会彼此干扰。独占锁定(Exclusive Locking):在独占锁定期间,其他线程既不能获取共享锁定,也不能获取独占锁定。这通常在写入操作中使用,以确保数据在写入期间不会被其他线程修改。lock(): 获取独占锁定。原创 2023-11-20 20:32:58 · 518 阅读 · 0 评论 -
C++17 string_view用法介绍
这个内存池使用一个vector来存储内存块,每个内存块的大小为blockSize。allocate函数会从freeList中取出一个内存块并返回,如果freeList为空,则会调用expandPool函数来扩展内存池。在示例中,我们使用内存池来分配和释放int类型的内存块。首先,我们分配一个内存块并将其赋值为42,然后再分配一个内存块并将其赋值为99。最后,我们释放这两个内存块。请注意,这只是一个简单的内存池实现示例,实际的内存池可能需要更复杂的管理和分配策略,以及对内存对齐和内存泄漏等问题的处理。原创 2023-08-07 16:21:27 · 169 阅读 · 0 评论 -
c++ http url encode decode
这些代码示例演示了如何使用C++对URL进行编码和解码。请注意,这些示例仅处理URL中的特殊字符,而不处理URL中的查询参数等其他部分。如果需要处理更复杂的URL,请使用相应的URL库或框架。原创 2023-08-01 11:56:59 · 997 阅读 · 0 评论 -
C++ RapidJSON使用详解
RapidJSON主页:RapidJSON 是由腾讯开发的一个 C++ 的 JSON 解析器及生成器,它的灵感来自 RapidXml。原创 2023-06-03 23:39:22 · 1267 阅读 · 0 评论 -
C++模拟go defer
在Go语言中,defer语句用于在函数返回之前执行一些代码。这对于释放资源或记录函数执行时间非常有用。当函数中有多个defer语句时,它们将按照后进先出(LIFO)的顺序执行。结果输出。原创 2023-04-10 22:45:14 · 483 阅读 · 0 评论 -
Modern C++ JSON nlohmann::json 使用详解
Modern C++ json使用方法原创 2022-05-25 16:00:41 · 2063 阅读 · 0 评论 -
C++ mysql connector使用方法
mysql connector的下载 C++ 操作mysql数据库可以用原生的api, 也可以用mysql connector, 在mysql下载页可以找到下载入口 https://dev.mysql.com/downloads/, 如下图:在vs2019中的配置头文件 Conneector 的使用方式和常规sdk一样,包含头文件,静态库,动态库即可。注意Conneector 在8.0之后需要boost支持,在vs中需要配置boost的路径,如下:lib路径 在附加依赖项添加静态库名原创 2021-04-23 19:07:47 · 1513 阅读 · 0 评论 -
windows C++ 网络编程
一、什么是Socket socket即套接字,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);前两种较常用。基于TCP的socket编程是采用的流式套接字。 ...原创 2019-06-10 21:16:24 · 12976 阅读 · 0 评论 -
C++ tcp一个服务端对应多个客户端
在tcp编程时,有时服务端需要处理多个客户端的连接,下面给出处理模型,在服务端监听后,写个while循环处理多个客户端的连接.tcp server代码如下:#include <winsock2.h>#include <iostream>#include <thread>using namespace std;//链接socket lib#pragma comment(lib, "ws2_32.lib")//线程处理函数void ThreadFun原创 2021-07-12 20:34:17 · 980 阅读 · 0 评论 -
C++模板特化与偏特化的说明与代码示例
模板特化的定义模板特化不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化,以实现特定类型下非通用行为。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。特化主要分三种(1)全特化:将模板的参数全部指定为特定类型,类和函数都支持(2)偏特化:部分参数指定为特定的类型,模板函数不支持偏特化(3)特化为另外一个类模板(复杂点的偏特化),其实这种也是类似于1,2形式类的特化例如下面是类的全特化与偏特化的写法:#include <iostream>us原创 2021-04-09 19:24:53 · 360 阅读 · 0 评论 -
C++类默认有哪些函数
例如下面一个空类Test,没有任何代码class Test{};一 空类的大小 在main方法中计算Test空类的大小,int main() { cout << "空类大小是 : " << sizeof(Test) << endl; return 0;} 输出结果:空类大...原创 2020-03-31 23:19:48 · 577 阅读 · 0 评论 -
vs2017编译使用jsoncpp
C++ 解析json的方式有很多,libjson, jsoncpp, boost等,我的另一篇博客有boost解析json的用法,有兴趣的可以看看,本篇介绍jsoncpp的使用。一 、cmkae vs2017编译jsoncpp 下载jsoncpp源码:https://github.com/open-source-parsers/jsoncpp 在源...原创 2020-04-06 23:23:57 · 3050 阅读 · 4 评论 -
STL multiset使用说明与代码演示
STL multiset特点 (1)数据有序,可重复 (2)删除元素时,相同的所有元素都会被删掉 使用时需要包含头文件<set>. 代码:#include <iostream>#include <set>using namespace std;//输出multisetvoid out(const multiset<int> obj){ for (auto item ...原创 2020-05-17 22:14:03 · 230 阅读 · 0 评论 -
C++ STL之set
1. SLT介绍set 特点:关联容器,值唯一,有序。内部实现是红黑树。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。在面试时经常会问到如下问题:(1)为何map和set的插入...原创 2019-09-09 18:51:36 · 643 阅读 · 0 评论 -
C++ STL multimap与unordered_map
一 multimap用法说明 multimap, 允许元素重复的关联容器,它的内部实现也是用的红黑树,例如下面的代码#include <iostream>#include <map>#include <string>using namespace std;int main(){ multimap<int, string> mmap = { {3, "鲁班"}, {2, "后裔"} }; mmap.insert(mak......原创 2020-07-17 22:48:50 · 1034 阅读 · 0 评论 -
VS2019编译OpenSSL源码
OpenSSL是什么? OpenSSL是一个开放源代码的软件库包,英文全称是Open Secure Sockets Layer,中文叫法是开放式安全套接层协议。应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。 官网 https://www.openssl.org/ github : https://github.com/openssl/openssl github 代...原创 2021-04-04 15:57:43 · 448 阅读 · 0 评论 -
c++ zlib加密压缩文件详细介绍与代码演示
c++ zlib加密压缩文件 windows平台可以下载zip或者tar.gz的文件,目前的版本是1.2.11,下面将提供3种编译方法。一 命令行形式编译 在开始菜单找到VS2017x64_x86交叉工具命令提示符,注意这样编译的32位的版本。跳转到zli...原创 2020-02-03 12:32:57 · 2431 阅读 · 0 评论 -
VS2015编译 Lua源码
Lua作为一门热门的脚本语言, 在游戏,程序热更新等领域使用很广,Lua的解释器是用C语言写的,源码不过一万多行。作为程序员,详细学习一门语言的源码是很有必要的,可以说Lua的源码,是程序员最容易掌握的,不像JVM那么庞大。 Lua和Java一样,也是基于“虚拟机”的,下面介绍Lua源码的编译方法,开发工具是VS2015, 源码版本Lua5.3.4, 没有该版本的,可...原创 2019-01-10 10:22:37 · 587 阅读 · 0 评论 -
vs2017编译libcurl源码
libcurl简介 当客户端项目设计到web开发时,需要使用到相关通信框架,libcurl是很好的选择,使用libcurl和服务端通信,获取相关数据,在客户端再做相关逻辑处理。 libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书...原创 2020-04-07 12:00:46 · 616 阅读 · 0 评论 -
VS2017编译sqlite3生成lib,dll
sqlite官网:https://www.sqlite.org/index.html sqlite3源码及dll下载链接:https://www.sqlite.org/download.html 官网只提供了dll, 没有lib, 需要我们自己编译。vs编译sqlite的方法有两种,一种是建立工程源码编译,另一种是命令行编译,下面分别介绍。1 命令行编译 把路径 C:\Program Files (x86)\Microsoft Visual ...原创 2020-05-11 19:43:26 · 993 阅读 · 0 评论 -
C++ sqlite基本操作代码示例
在sqlitebrowser中创建一个数据库,添加一些数据。如下: 用vs2017创建C++控制台项目,配置好sqlite sdk,.h, .lib, .dll, 即可进项编程了。C++代码:/*sqlite数据库基本使用*/#include <iostream>#include "sqlite3.h"#include <Windows.h>#pragma comment(lib, "sqlite3.lib")using name...原创 2020-05-11 21:24:27 · 704 阅读 · 0 评论 -
C++ tinyxml2解析xml文件【详细代码】
tinyxml2官网:http://www.grinninglizard.com/tinyxml2/index.html github下载链接:https://github.com/leethomason/tinyxml2 源码文件就两个, .h .cpp, 可以直接放到项目中使用,也可以编译成lib或者dll在程序中引用。下面介绍如果编译成dll: 在tinyxml2目录有vs的解决方案文件 上面显示的是VS2010的项目,我用vs...原创 2020-05-10 23:01:10 · 1118 阅读 · 0 评论 -
CMakeLists.txt编写教程
先安装cmake, 在windows控制台,输入cmake --version 可以查看cmake的版本,cmake主要用来实现项目的跨平台构建与编译,例如下面的代码:helloworld.cpp#include <iostream>using namespace std;int main(){ cout << "hello cmake" << endl; system("pause"); return 0;}编写CMakeList原创 2021-04-29 20:18:00 · 1379 阅读 · 0 评论 -
C++ log4cplus完整示例与运行测试
在使用C++开发项目时,需要看程序的运行信息,可以自己写个log类,也可以用开源的,自己写的可能没有成熟的开源log功能好,本篇博客介绍log4cplus的在win10 VS2017上的编译与使用。 下面开始介绍log4cplus的编译与使用。1. 下载源码 log4cplus链接:https://sourceforge.net/projects/lo...原创 2019-12-29 22:14:54 · 1984 阅读 · 1 评论 -
C++程序生成dump文件并分析dump
C++ 开发客户端时,如果需要分析程序运行时崩溃的问题,可以在代码中添加生成dump的功能,这里介绍用VS开发时如何生成dump文件,以及dump文件的分析方法。 VS开发时,debug模式的“优化功能”是禁用的,release时是启用了优化,此时是无法生成dump文件的,需要打开“优化禁用”选项,如下图: 生成dump的代码:/*dum...原创 2020-03-31 17:56:14 · 4984 阅读 · 0 评论 -
C++ MySQL8.0连接与数据查询
安装好MySQL8版本后,在安装目录会有mysql C++连接的头文件,静态库和动态库。如下图: 用VS2017新建C++控制台程序,根据安装的mysql是x86还是x64, 在项目属性中配置包含mysql头文件目录:C:\Program Files\MySQL\MySQL Server 8.0\include 包含lib目录:C:\Program Files\...原创 2020-04-25 21:03:23 · 2043 阅读 · 0 评论 -
STL仿函数与函数对象浅析
例如,一个很简单问题,求两个数中的较大数,用C++代码很好写,如下:int Max(const int num1, const int num2){ return num1 >= num2 ? num1 : num2;} 对于这种问题,如果你想把代码写的让人捉摸不透,怎么搞呢?那么就用STL仿函数functor来实现,也可以称之为函数对象,在struct或class内重载()操作符来实现,那么上面的代码可以改写成下面这种形式:struct Max...原创 2020-05-17 22:49:41 · 299 阅读 · 0 评论 -
C++ STL map使用详细介绍(插入,遍历、查找,删除,仿函数自定义map排序)
简单说说C++ STL map的特点,map是有序键值对,默认是按key值递增存储,可以理解为函数有递增趋势的函数f(x, y),既然是函数,那么一个x只能对应一个y, 而一个y可以有多个x对应,也就是说,在map中,key不能重复,value可以重复。 至于map的内部实现红黑树,本篇就不说了,太多了,扯不清楚。主要说说map的基本使用。 map的声明 map<keyType, valueType>...原创 2020-07-11 01:33:31 · 1135 阅读 · 0 评论 -
ProcessExplorer查找C++ exe程序运行所需要的的dll
当我们把自己打包的exe程序放到别人电脑时可能出现缺少dll的情况,此时可以用ProcessExplorer工具找出对应的dll, 把exe先运行起来,将ProcessExplorer工具栏的靶子拖动到运行的exe窗口上,此时该exe会被ProcessExplorer监控到 如下图 我是用MFC写的程序,那么就就需要mfc系列的头文件,如果没有dll栏目,需要在菜单中设置, 找到该dll, 右击属性就会看到dll路径了。...原创 2020-06-14 15:54:09 · 1116 阅读 · 0 评论