C++
哎哟哟爱民谣
这个作者很懒,什么都没留下…
展开
-
C++实战 std::ref的使用
可以方便地将外部对象引用传递给函数,使得函数可以直接访问和修改该对象,而不需要进行复制。这对于大型对象或者对象在多个函数之间共享时特别有用。是 C++ 标准库中的一个模板类,用于创建一个对给定对象的引用。它可以用于在函数参数中传递引用,以及在某些情况下避免不必要的复制。否则,当对象被销毁后,引用将变为悬空引用(dangling reference),导致未定义的行为。下面是一个简单的示例,展示了如何使用。的值,而输出的结果也证明了这一点。在上面的示例中,我们使用。的引用,并将其传递给。原创 2023-08-01 14:36:16 · 476 阅读 · 0 评论 -
基于ZLMediaKit实现同步发送接收数据的TCP Client
本来是个Qt项目,按理说使用QTcpSocket岂不是更好,但是,QTcpSocket在多线程方式下使用时,各种报错或警告,原因是非多线程安全,如果改造成多线程安全,各种信号槽,又不怎么优雅。所以,基于ZLMediaKit写了一个,代码,贴在此处,大家帮忙参谋一下,存在哪些问题?原创 2023-05-02 12:55:00 · 328 阅读 · 0 评论 -
C++实战 自旋锁及其实现
非自旋锁和自旋锁是完全不一样的,如果它发现此时获取不到锁,它就把自己的线程切换状态,让线程休眠,然后 CPU 就可以在这段时间去做很多其他的事情,直到之前持有这把锁的线程释放了锁,于是 CPU 再把之前的线程恢复回来,让这个线程再去尝试获取这把锁。在很多场景下,可能我们的同步代码块的内容并不多,所以需要的执行时间也很短,如果我们仅仅为了这点时间就去切换线程状态,那么其实不如让线程不切换状态,而是让它自旋地尝试获取锁,等待其他线程释放锁,有时我只需要稍等一下,就可以避免上下文切换等开销,提高了效率。原创 2023-04-19 09:39:32 · 293 阅读 · 0 评论 -
为什么用成员初始化列表会快一些
成员初始化列表就是在类或者结构体的构造函数中,在参数列表后以冒号开头,逗号进行。因为使用成员初始化列表进行初始化的话,会直接使用传入参数的拷贝构造函数进行初始。化,省去了一次执行传入参数的默认构造函数的过程,否则会调用一次传入参数的默认构。所以使用成员初始化列表效率会高一些。分隔的一系列初始化字段。原创 2022-12-21 22:24:01 · 703 阅读 · 0 评论 -
C++实战 删除字符串的头尾空白符
个人感觉,最核心和最巧妙的地方是,这个算法将“空格、回车、换行、tab”等,存入一个长度为255的string,与空白字符索引相同的值设为1,其他设为0。然后,遍历源字符串s的尾部和首部字符,如果该字符在map字符串中对应的值为‘\1’,那么,就执行pop操作。如果,每次字符比对,还要遍历一次空白字符集,那么,时间复杂度就是O(n*n)了。今天看到一个与平时不一样的算法,因此,第一时间想跟大家分享一下。通过这种实现方式,可以做到O(n)的时间复杂度。...原创 2022-08-08 09:53:49 · 1232 阅读 · 0 评论 -
C/C++实战 - 获取当前时间的毫秒表示
代码】C/C++实战-获取当前时间的毫秒表示。原创 2022-07-17 16:19:49 · 703 阅读 · 0 评论 -
C++ 获取当前程序的路径编码实战
在工程实践中,很多同学非常头疼获取当前应用程序的路径,不像Qt有现成的接口可用。这里给大家提供一个经过个人实践证明可用的实战代码,请大家自取使用。原创 2022-06-21 22:31:39 · 794 阅读 · 0 评论 -
C++ 随机字符串生成实战
工程中,我们经常遇到要生成一个固定长度的随机字符串,比如用作文件名,或者用作加密的key等。下面就把我用到的实战代码放在下面,请大家自取使用。std::mt19937是伪随机数产生器,用于产生高性能的随机数。 C++11引入。返回值为unsigned int。std::mt19937接收一个unsigned int数作为种子。所以可以如下定义:mt是因为这个伪随机数产生器基于Mersenne Twister算法。19937是因为产生随的机数的周期长,可达到2^19937-1。...原创 2022-06-21 22:03:15 · 1911 阅读 · 0 评论 -
C/C++ base64编解码实战
这里提供2种base64编解码的实现方式:代码均是个人实战验证过的,可放心使用。纯C语言实现cpp文件基于OpenSSL的内的编解码组件实现OpenSSL内部封装较好,所以代码比较短。在OpenSSL一统天下的年代,涉及网络安全访问,加解密的业务,没有几个公司是不用的。如果,我的分享给您带来了帮助,别忘了给博主点个赞,大家的支持会促使我为大家分享更多的干货。...............原创 2022-06-19 09:25:32 · 625 阅读 · 0 评论 -
一文看懂std::weak_ptr的用法
一文看懂std::weak_ptr的用法原创 2022-06-03 20:30:27 · 1319 阅读 · 0 评论 -
C++中LHS和RHS指什么
对于LHS和RHS,懂得都懂,不懂的一看就懂LHS 赋值操作的左侧 Left Hand Side,一般指左值。RHS 赋值操作的右侧 Right Hand Side,一般指右值。原创 2022-04-14 21:41:41 · 3356 阅读 · 1 评论 -
C++代码中R“(xxxxxxxxxxx)“
在 C++11 中添加了定义原始字符串的字面量,定义方式为:R “xxx (raw string) xxx”, ()两边的字符串在解析的时候是会被忽略的,因此一般不用指定。如果在()前后指定了字符串,那么前后的字符串必须相同,否则会出现语法错误。 string str1 = R"(C:\test.text)"; cout << str1 << endl; string str2 = R"hello(C:\test.text)hello"; cout &原创 2022-04-14 00:13:53 · 7343 阅读 · 0 评论 -
std::unordered_map主键为结构体
在C++中,当我们将某个数据或对象保存为二进制进行存储或发送时,经常使用std::vector<char>,与new char[LEN],使用std::vector<char>相比有什么好处呢?std::vector<char>作为一个容易,对字符数组进行了封装,提供了丰富的接口,不需要手动进行内存的释放,std::vector<char>的对象出了作用域,会进行自动释放内存。今天讲一讲,使用std::vector<char>的对象进行二进原创 2022-04-12 23:48:19 · 1483 阅读 · 2 评论 -
std::ifstream按行读取文本文件
按行读取并打印 std::string file_path = "xxxxx.txt"; std::ifstream infile(file_path); std::string line; while (std::getline(infile, line)) { std::cout << line << std::endl; }原创 2022-04-12 21:40:27 · 2681 阅读 · 0 评论 -
单件基类实现与使用
单件基类实现template<typename T>class PublicSingleton{protected: PublicSingleton() {}public: static T& getInstance() noexcept(std::is_nothrow_constructible<T>::value) { static T instance; return instance; }原创 2022-04-12 21:33:57 · 153 阅读 · 0 评论 -
基于SDBM算法的哈希值计算
/// Update a hash with the given 8-bit value using the SDBM algorithm.inline constexpr unsigned SDBMHash(unsigned hash, unsigned char c){ return c + (hash << 6u) + (hash << 16u) - hash; }/// Calculate hash value from a C string.sta...原创 2022-03-30 23:29:47 · 1004 阅读 · 0 评论 -
C++中,返回值优化是什么?
C++中,返回值优化是什么?原创 2022-01-09 11:17:45 · 544 阅读 · 0 评论 -
C++中如何区分左值和右值
C++中如何判断左值还是右值原创 2022-01-09 11:02:56 · 1342 阅读 · 0 评论 -
likely()和unlikely()
首先:if (likely(value))等价于if (value)if (unlikely(value))等价于if (value)其次:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)__built_expect()函数是gcc(version >= 2.96)的内建函数,提供...原创 2021-07-07 21:31:26 · 137 阅读 · 0 评论 -
创建一个不受系统缩放设置(DPI)影响的GUI窗口
现在的屏幕分辨率都比较高,为了使屏幕字体不至于太小,通常在 Win10的显示设置里面设为放大 125%或 150%或更大,这样就会导致像素实际上被放大了。如果你的程序不希望受系统缩放设置影响,你需要使用一个新的 API 函数:SetProcessDpiAwarenessvoid setupDPIAwareness(){ typedef HRESULT *(__stdcall *SetProcessDpiAwarenessFunc)(PROCESS_DPI_AWARENESS); HM...原创 2021-05-11 22:28:25 · 1268 阅读 · 2 评论 -
为Windows GUI窗口应用程序创建控制台
// Win32 : Sets up a console window and redirects standard output to itvoid VulkanExampleBase::setupConsole(std::string title){ AllocConsole(); AttachConsole(GetCurrentProcessId()); FILE *stream; freopen_s(&stream, "CONOUT$", "w+", stdout); fre.原创 2021-05-11 22:19:54 · 378 阅读 · 0 评论 -
Linux 通过pid获取进程启动路径
char file[32];char buf[64];pid_t pid = getpid();sprintf(file, "/proc/%i/cmdline", pid);FILE *f = fopen(file, "r");fgets(buf, 64, f);fclose(f);原创 2021-04-19 11:22:59 · 389 阅读 · 0 评论 -
MSB3073 命令setlocal问题的解决
在使用VS编译代码时遇到如下问题:我们首先了解一下setlocal是做什么的:setlocal是指批处理本地化的一种操作,使启动批处理文件中环境变量的本地化。本地化将持续到出现匹配的 endlocal 命令或者到达批处理文件结尾为止。问题分析因为VS中配置的批处理的脚本中,setlocal操作的C盘的目录,而VS并不是以管理员用户启动的,所以在执行setlocal时,没有权限。所以出现了上述问题。解决方案启动VS时,以管理员权限运行VS,再编译程序...原创 2020-08-01 16:34:24 · 10271 阅读 · 9 评论 -
C/C++ 判断字符串中是否包含BOM
如果文件中包含BOM,那么将文件内容按照二进制的方式读取后,字符串的第一个字节为0xef,第二个字节为0xbb,第三个字节为0xbf。代码实现如下:bool has_utf8_bom(const char *in_char){ uint8_t *in = (uint8_t *)in_char; return (in && in[0] == 0xef && in[1] == 0xbb && in[2] == 0xbf);}...原创 2020-07-11 17:54:18 · 788 阅读 · 0 评论 -
C/C++实现去除字符串两头的空字符
// 判断是否为空白字符inline bool is_padding(char ch){ return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r';}// 去除空白字符char *strdepad(char *str){ char *temp; size_t len; if (!str) return str; if (!*str) return str; temp = str; /* remove pr.原创 2020-07-11 15:39:42 · 1009 阅读 · 0 评论 -
你真的了解extern C吗
C++是一种面向对象的语言,支持函数的重载,而C语言是面向过程的语言,不支持函数的重载。同一个函数在C++环境编译后与其在C语言环境下编译后,在符号表中的签名是不同的。假如有一个函数:void decode(float position, float duration);在C语言环境下编译出来的签名为_decode,而在C++语言环境下,一般编译器生成的函数签名类似_decode_float_float。虽然在编译阶段是没有问题的,但是在连接阶段,如果不加extern "C"关键字的话,那么将会链原创 2020-06-16 22:59:19 · 166 阅读 · 0 评论 -
C++正则表达式实现检测IP地址是否有效
bool megutil::CheckIPAddrIsVaild(std::string str){ std::regex reg("(?=(\\b|\\D))(((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))(?=(\\b|\\D))"); return std::regex_match(str, reg);}原创 2020-06-15 18:51:18 · 1227 阅读 · 0 评论 -
1分钟搞懂内联函数
什么是内联?inline就是编译时,建议编译器将函数的调用,展开为函数体代码内联函数的特点:编译器会将函数调用直接展开为函数体代码 可以减少函数调用的开销 会增大代码的体积注意事项:尽量不要内联超过10行代码的函数 有些函数即使声明为inline,也不一定被编译器内联,比如递归函数...原创 2020-06-14 14:24:28 · 305 阅读 · 0 评论 -
#pragma once与#ifndef #define #endif的异同
1、#pragma once和起到和#ifndef #define #endif的相同点他们都可以做到防止头文件的内容被重复包含的作用2、#pragma once和起到和#ifndef #define #endif的不同点#ifndef #define #endif受C/C++标准的支持,不受编译器的任何限制 较老的编译器不支持#pragma once,如gcc 3.4,兼容性不够好 #ifndef #define #endif可以针对一个文件的部分代码,而#pragma once只.原创 2020-06-14 11:44:05 · 183 阅读 · 0 评论 -
一个普通未实现的函数,可以声明多次吗
可以的,实现时只实现一次就可以了。#include <iostream>using namespace std;void func(int a, int b);void func(int a, int b);int main(){ func(1, 2); return 0;}void func(int a, int b){ cout << a << endl; cout << b << endl;}那.原创 2020-06-14 11:26:36 · 1594 阅读 · 1 评论 -
如何使用Windows API实现动态库加载、函数导入、动态库释放
#include <windows.h> #include <stdio.h> typedef int (__cdecl *MYPROC)(LPWSTR); int main( void ) { HINSTANCE hinstLib; MYPROC ProcAdd; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; // 获取动态链接库的句柄 hinstLib = Loa.原创 2020-06-02 23:38:16 · 950 阅读 · 0 评论 -
Qt 实现滚动请求数据的方法
以QListWidgt为例QTreeWidget的实现方式可以以此示例作为参考去实现,这里不再做实现。MainWin.h#ifndef MAINWIN_H#define MAINWIN_H#include <QWidget>#include <QList>QT_BEGIN_NAMESPACEnamespace Ui { class MainWin...原创 2020-02-22 21:21:26 · 1515 阅读 · 0 评论 -
Qt 解决网络传输数据分块导致数据解析后乱码
当接收到网络数据,可能多字节编码的字符被分到了2个块中,这可能会导致数据丢失或数据转换失败。解决这个问题的方法就是为这个编码创建一个解码器对象,在整个解码过程中使用这个解码器。示例如下:QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");QTextDecoder *decoder = codec->makeDecoder(...原创 2020-02-08 12:00:44 · 536 阅读 · 0 评论 -
Qt QStringLiteral(str)有什么用
Qt 为我们提供了 QStringLiteral(str) 宏使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。如果编译器支持,则 QStringLiteral 宏在编译时从 str 生成一个 QString 的数据。在这种情况下从 QStringLiteral 创建一个 QString ...原创 2020-01-28 23:28:49 · 12005 阅读 · 0 评论 -
Qt QT_WIDGETS_LIB和QT_GUI_LIB的区别
如果定义了QT_WIDGETS_LIB,那么应用程序的对象就是QApplication;如果定义了QT_GUI_LIB,那么应用程序的对象就是QGuiApplication;否则,应用程序的对象就是QCoreApplication。如果使用qmake,并且配置中包含QT += widgets,那么就会自动定义QT_WIDGETS_LIB;类似的,如果使用了qmake,并且配置中包含QT ...原创 2020-01-28 22:30:28 · 1297 阅读 · 0 评论 -
Qt QWidget之捕获
窗口的捕获参考 Qt截图抓屏方法鼠标捕获未显式捕获鼠标的控件将得不到焦点QLineEdit* edt1 = new QLineEdit(this);QLineEdit* edt2 = new QLineEdit(this);edt2->grabMouse();键盘捕获未显式捕获键盘的控件将不得不到输入字符文字QLineEdit* edt1 = new Q...原创 2020-01-27 16:51:12 · 702 阅读 · 0 评论 -
Qt 截图抓屏方法
QWidget的render方法QPixmap pixmap(widget->size()); widget->render(&pixmap);QPixmap的grabWidget方法QPixmap pic = QPixmap::grabWidget(widget);QPixmap的grabWindow方法QPixmap pic = QPixm...原创 2020-01-27 16:05:26 · 887 阅读 · 0 评论 -
OpenCV获取视频文件时长
#include "opencv2/opencv.hpp"using namespace cv;VideoCapture capture(“d:/test.mp4”);if (!capture.isOpened()){ return;}// 时长计算int iVideoTime = capture.get(CV_CAP_PROP_FRAME_COUNT) / captu...原创 2020-01-20 14:08:41 · 2369 阅读 · 0 评论 -
如何让VS2015在release模式下进行调试
步骤如下:工程名称上,右键→属性 c++→常规→调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi) c++→优化→优化 选 已禁止(/Od) 链接器→调试→生成调试信息 选 是 (/DEBUG)...原创 2020-01-20 12:04:12 · 279 阅读 · 0 评论 -
Qt Qt Creator中中文编译失败和乱码
场景1:在Qt Creator中使用msvc的编译器编译,报错“常量中有换行符”原因:MSVC编译器只支持utf-8带BOM的方式,对UTF8格式的代码文件支持不够好,而默认的文件编码是utf-8格式。解决方案:(1)打开Qt Creator,点击菜单“工具”-“选项”(2)在“文本编辑器”-“行为”选项卡中,将文件编码更改为 UTF-8,并且选择“如果编码是UTF-8则添加”...原创 2020-01-11 11:41:12 · 878 阅读 · 2 评论