C++ 基础
文章平均质量分 57
C++ 语法,常见问题记录,分享
令狐掌门
C++程序员,出版过《C++零基础入门视频教程》、《Qt高级进阶视频教程》、《OBS源码分析与桌面录制视频教程》、《PyQt PySide6零基础入门与项目实战》。
展开
-
C++学习书籍推荐
如果你想学习C++, 没必要先学C语言,C++学会了绝对会C语言。如果会C语言,再学C++会轻松一些。建议直接学习C++。下面推荐一些我读过的C++书籍, 我不是打广告,作者也没给我钱。纯属个人建议一 入门篇(1)C++ Primer, 本书提供了全部示例的源码,而且打印很好,字体大小合适,看着也舒服,可以花点时间多读几遍(2)C++ Primer plus, 不建议读,讲的太啰嗦了,而且字体很小,看着对眼睛不好。二提高篇(1)侯捷大师翻译的 C++ 内功心法,...原创 2020-11-09 01:04:22 · 16681 阅读 · 3 评论 -
C malloc经典面试题解答与分析
本篇博客介绍关于C malloc经典的错误代码写法以及解决方法。原创 2024-06-21 21:30:00 · 964 阅读 · 0 评论 -
快速UDP网络连接之QUIC协议介绍
这个算法在多媒 体网关拥塞控制有重要的地位。QUIC的FEC是使用的XOR的方式,即发N + 1个包, 多发一个冗余的包,在正常数据的N个包里面任意一个包丢了,可以通过这个冗 余的包恢复出来,使用异或可以做到切换网络操持连接。由于原始包和重传包的序列号是一样的,客户端不知道服 务器返回的 ACK 包到底是原始包的,还是重传包的。新的传输层协议通常会经过严格的设计,分析和评估可重复的结果,证明候选协议对 现有协议的正确性和公平性,开发新的传输层协议和它在操作系统进行广泛部署之间 通常需要花费数年的时间。原创 2024-06-16 15:01:14 · 1854 阅读 · 0 评论 -
linux c socket编程里SO_REUSEADDR的作用
这段代码的主要作用是设置 SO_REUSEADDR 选项,以允许在套接字处于 TIME_WAIT 状态时,其他套接字可以绑定到相同的本地地址和端口。这在服务器应用程序中特别有用,可以减少由于端口占用导致的启动失败问题。如果设置失败,代码会记录错误信息。在这个示例中,套接字创建成功后,使用 setsockopt 设置 SO_REUSEADDR 选项,以便允许地址重用。如果 setsockopt 调用失败,程序会输出错误信息并终止。setsockopt 函数用于设置套接字选项。原创 2024-06-03 20:24:13 · 410 阅读 · 0 评论 -
C++ CMake FetchContent用法介绍
CMake 的 FetchContent 模块是一个非常方便的工具,用于在构建过程中从远程位置下载和管理外部依赖项。通过 FetchContent,您可以在项目的 CMake 配置过程中下载、提取和添加外部项目,而不需要手动管理这些依赖项。原创 2024-06-03 09:12:58 · 1312 阅读 · 0 评论 -
C++线程任务队列模型
这个程序实现了一个简单的任务队列,其中任务类表示一个可执行的任务,具有状态(未开始、进行中、已完成)。任务队列类负责管理任务的添加和执行,执行方式为串行执行。每个任务的执行时间是随机的,并且在执行过程中会输出当前的进度信息。在任务队列中添加2个任务并执行,所有任务完成后退出程序。串行任务队列开始执行,共有2个任务。实现一个任务队列,用于任务的执行。任务1开始执行,将运行3秒。任务2开始执行,将运行2秒。串行队列执行输入示例如下。任务1已完成100%任务2已完成100%原创 2024-05-29 01:15:16 · 275 阅读 · 0 评论 -
C++实现生产者消费者模型
生产者-消费者模型是一种典型的多线程并发模式,常用于在一个共享缓冲区中协调生产者和消费者之间的数据传递。在C++中,我们可以使用标准库中的线程、互斥量和条件变量来实现该模型。原创 2024-05-29 01:11:36 · 666 阅读 · 0 评论 -
Windows hook介绍与代码演示
Windows Hook 是一种机制,允许应用程序监视系统或处理特定事件。它可以拦截和更改消息,甚至可以插入到其他应用程序的消息处理机制中。Windows 提供了多种挂钩类型,例如键盘挂钩、鼠标挂钩、消息挂钩等。原创 2024-05-28 23:02:32 · 788 阅读 · 0 评论 -
ubuntu strace命令
是 Linux 系统中的一个调试工具,用于跟踪并记录系统调用(system calls)和信号(signals)。在 Ubuntu 中,命令可以帮助开发者和系统管理员了解一个程序在运行时如何与操作系统内核进行交互,从而有助于诊断和调试问题。,可以深入了解程序的运行过程,找到并解决潜在的问题。例如下面的C++程序。原创 2024-05-28 21:23:22 · 571 阅读 · 0 评论 -
C++实现读写锁
在C++中,实现读写锁可以使用,它是C++17标准中引入的。读写锁允许多个线程同时读取一个共享资源,但在写入时,只允许一个线程对资源进行写入,并阻止其他线程读取或写入。下面是使用实现读写锁的示例代码,包括一个简单的共享数据访问类和在mainSharedDatareadDatawriteDatamain替换和为你的文件名和希望生成的程序名。这段代码在一个多线程环境下测试了读写锁的工作方式。原创 2024-04-07 08:15:00 · 1091 阅读 · 0 评论 -
C++手写链表、反转链表、删除链表节点、遍历、为链表增加迭代器
本篇博客介绍如何使用C++实现链表,首先编写一个简单的链表,然后增加模板,再增加迭代器。原创 2024-03-15 21:39:59 · 1359 阅读 · 0 评论 -
C++按逗号分割string保存到vector
C++按逗号分割string保存到vector原创 2024-01-27 09:44:48 · 491 阅读 · 0 评论 -
C++合并K个有序链表
本篇博客介绍如何使用C++合并k个有序链表,在代码中会用到std::priority_queue,首先需要介绍一下std::priority_queue的用法,介绍完std::priority_queue后将介绍如何使用std::priority_queue来辅助合并k个有序链表。原创 2024-01-08 21:18:44 · 984 阅读 · 0 评论 -
linux sigaction函数使用介绍
在linux中函数 `sigaction` 用于检查或修改与指定信号相关联的处理动作。这个函数比 `signal` 函数提供了更多的控制能力,包括对信号处理的细粒度控制。原创 2024-01-08 21:18:03 · 511 阅读 · 0 评论 -
C++ vector使用数组进行初始化
【代码】C++ vector使用数组进行初始化。原创 2023-11-19 17:29:14 · 103 阅读 · 0 评论 -
C++使用线程池模拟异步事件处理机制
在C++很多框架中都有异步事件处理机制,这导致我们在看源码时经常很疑惑,难以理解,而其中包含的编程套路可能是一些成熟的技术,只是我们不熟悉,比如WebRTC中类似于Qt的信号槽机制,线程事件处理, 或者使用系统异步IO等等,如果看不懂这些套路,理解代码会很难,本篇博客来尝使用用C++线程池实现一种异步事件处理机制。原创 2023-11-11 15:06:04 · 380 阅读 · 0 评论 -
Linux C++静态库动态库以及链接方式介绍
文件):静态库是一种归档文件,其中包含了一堆可重用的目标文件,这些目标文件通常是C/C++函数的实现。当静态库被链接到程序中时,需要的目标文件会被复制并包含在最终的可执行文件中。文件):动态库在程序运行时才被加载到内存,一个动态库可以被多个正在运行的程序共享,这样可以节省内存。在Linux系统中,C/C++库分为静态库和动态库两种类型。以上就是在Linux系统中使用CMake创建和链接静态库和动态库的基本方法。以下是使用CMake来创建和链接静态库和动态库的基本示例。关键词用于指定创建静态库或动态库。原创 2023-11-05 20:55:51 · 533 阅读 · 0 评论 -
C++求解汉明距离
leetcode 461 汉明距离,难度:简单两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。示例 1:输入:x = 1, y = 4输出:2解释:对应二进制位不同的位置个数为2示例 2:输入:x = 3, y = 1输出:1提示:此题使用Brian Kernighan算法, 可以很快的得出答案。原创 2022-11-28 19:48:16 · 1335 阅读 · 0 评论 -
二叉树的定义与C++实现
树,是有限节点的集合。生活中的树是树根在下面,数据结构中的树的根在顶部,如下图: 公司的人员组织架构,董事长,总经理,副总。。。,这种模型可以用二叉树表示,还有一些压缩算法也用到了树结构。树的几个概念(1)度:有几个直接的孩子,例如,A的度是3,它有BCD三个孩子,B的度是2,它有EF两个孩子,度为0的节点也就是叶子节点(终端节点)(2)祖先:E的祖先是B,A , 从当前节点一直往上找(3)叶子节点:下面的一层称为叶子节点,也可以称为终端节点。(...原创 2020-08-01 21:49:04 · 2032 阅读 · 1 评论 -
C++实现string类
C++写一个string类,其实更多的是对C++内存分配,运算符重载的功能的运用。 MyString.h#pragma once#include <iostream>using namespace std;class MyString{public: MyString(); //默认构造函数 MyString(int n, char c); //普通构造函数 ...原创 2021-04-13 19:19:24 · 667 阅读 · 0 评论 -
C++数据结构:普通队列与循环队列
什么是队列? 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。队列分类 普通队列与循环队列,普通队列可以看做是一列数据,环形队列可以看做是一个圆,当普通队列的数据索引可以循环设置时,普通队列就成了循环队列。这两种都可以用数组来实现。循环队列的C++实现 下面说明用数组实现循环队列的方法...原创 2020-06-14 22:32:24 · 1438 阅读 · 0 评论 -
C++实现单链表
本篇介绍如何用C++实现单链表首先需要定义节点Node.h#ifndef NODE_H#define NODE_Hclass Node{public: int data; Node *next;public: void printNode();};#endifNode.cpp#include "Node.h"#include <iostream>using namespace std;void Node::printNode(){ cout &l原创 2021-04-13 20:46:03 · 469 阅读 · 0 评论 -
C++ 堆、大顶堆、小顶堆、堆排序
堆(heaps)不是容器,而是一种特别的数据组织方式。};};int id;} };} };return 0;原创 2022-11-11 18:53:40 · 5349 阅读 · 0 评论 -
C++增强for循环
for循环是常见的代码语句,常规的for循环如下#include <iostream>using namespace std;int main(){ int array[] = { 1,1,2,3,5,8 }; //常规for循环 for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) { cout << array[i] << " "; } cou...原创 2020-05-17 19:07:58 · 12753 阅读 · 1 评论 -
C++ lambda表达式用法说明
C++ lambda表达式的本质就是重载了 operator(),lambda是一个类,在调用时会进行编译展开。因此lambda表达式对象其实就是一个匿名的functor,所以 lambda 表达式 也叫匿名函数对象。C++中lambda表达式的构成 一个标准的lambda表达式包括:捕获列表、参数列表、mutable指示符、异常列表、返回类型(->...原创 2020-04-09 21:26:48 · 950 阅读 · 1 评论 -
C++11原子操作的应用与分析
所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。 在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇...原创 2019-06-13 20:58:19 · 839 阅读 · 3 评论 -
C++11关键字constexpr看这篇就够了
一、在普通函数中的使用例如下面的代码,数组的大小必须是常量,在声明数组array时,用函数返回值,此时会报错:error C2131: 表达式的计算结果不是常数note: 对未定义的函数或为未声明为“constexpr”的函数的调用导致了故障用constexpr关键字可以解决这种问题,在GetLen函数前加constexpr声明,代码如下:当然,constexpr修饰的函数也有一定的限制: (1)函数体尽量只包含一个return语句,多个可能会编译出错; ...原创 2020-10-26 23:50:46 · 32787 阅读 · 5 评论 -
C++ bind用法与代码演示
C++ bind, 有点类似函数指针,但是用法比函数指针更灵活,在绑定的时候可以预设值参数,例如下面的代码:#include <iostream>#include <functional>using namespace std::placeholders;void fn(int n1, int n2, int n3) { std::cout << n1 << " " << n2 << " " << n3 &l原创 2021-06-18 21:11:13 · 522 阅读 · 0 评论 -
基于C++ 11的线程池简单实现
C++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。” 貌似没有问题吧。但是写起程序来的时候就出问题了。 下面给出线程池的代码 threadpool.h#pragma once#ifndef THREAD_POOL_H#d转载 2021-06-20 21:58:09 · 484 阅读 · 0 评论 -
C++ std::transform使用方法与代码演示
std::transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。要使用std::transform函数需要包含头文件。 std::transform有两个重载方法,一个是对应于一元操作,一个是对应于二元操作。 示例代码如下:/*std::transform用法*/#include <algorithm>#include <iostream>#include <vector>using namespace st转载 2022-03-02 09:40:26 · 3034 阅读 · 1 评论 -
C++左值、右值、move、forward
C++11引入了右值引用,有一定的理解成本,工作中发现不少同事对右值引用理解不深,认为右值引用性能更高等等。本文从实用角度出发,用尽量通俗易懂的语言讲清左右值引用的原理,性能分析及其应用场景,帮助大家在日常编程中用好右值引用和std::move。1. 什么是左值、右值首先不考虑引用以减少干扰,可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 5;a可以通过 & 取地址,位于等号左边,所以a是左值。5位于等号右边,5没法通过 & 取转载 2022-03-14 21:53:21 · 458 阅读 · 0 评论 -
C++ std::function的使用方法
std::function是C函数指针的升级版,使C的面向过程与C++面向对象有了较大的区分,看下面的代码:/*std::function的使用*/#include <iostream>#include <functional>using namespace std;//声明function变量,参数为返回值为int,形参是int的函数std::function<int(int)> Func;int fun1(int a){ c原创 2021-06-20 18:03:07 · 1282 阅读 · 0 评论 -
C++11 initializer_list用法
initializer_list提供了新的初始化方式,例如需要在形参中传入多个值,可以用数组实现,C++11提供了新的初始化方式也可以实现,使用前需要包含头文件 #include <initializer_list> 例如求和#include <iostream>#include <initializer_list>using namespace std;int Sum(const initializer_list<i...原创 2020-10-17 00:50:48 · 980 阅读 · 1 评论 -
http get、post、put
这个例子中,我们发送了一个POST请求到"/path",并且我们设置了HTTP头部字段"Content-Type"为"application/x-www-form-urlencoded",然后我们发送了两个字段"field1"和"field2"。与 GET 不同,POST 请求会把数据和请求一起发送,数据不会附在 URL 上,而是在请求的消息体中。PUT:PUT 方法用于向指定资源位置上传其最新内容,PUT 方法是幂等的,即无论调用一次还是多次,服务器上的结果都是一样的。PUT 方法通常用于更新资源。原创 2023-08-07 18:08:26 · 2266 阅读 · 0 评论 -
C++网络编程Reactor模式介绍
但是,由于所有的事件都在一个线程中处理,如果某个事件处理时间过长,会阻塞其他事件的处理,因此在设计Handler时需要特别注意。Synchronous Event Demultiplexer:这是一个系统级别的组件,负责等待事件的发生。当事件发生时,它会通知Reactor。Handlers:这些是具体的事件处理器,它们定义了如何响应特定的事件。它会不断地检查是否有新的事件发生,如果有,就调用相应的事件处理器。Handler处理完事件后,返回控制权给Reactor,Reactor继续等待其他事件的发生。原创 2023-08-07 18:11:51 · 596 阅读 · 0 评论 -
后端开发, 接口幂等性是什么意思
如果一个接口不是幂等的,那么重复执行同样的请求可能会导致不同的结果,甚至引发意外的行为。可以使用数据库或缓存来记录已处理的标识符。如果标识符已经存在于记录中,说明该请求已经被处理过,直接返回之前的处理结果即可,从而实现幂等性。处理完请求后,将新的资源状态与之前的状态进行对比,如果相同,则说明请求未改变资源状态,返回成功;在后续的相同请求到达时,先检查 Token 是否已经存在,如果存在,直接返回之前的处理结果,实现幂等性。在后端开发中,接口的幂等性是指同一个请求的多次执行所产生的效果与执行一次的效果相同。原创 2023-08-07 21:17:09 · 980 阅读 · 0 评论 -
linux epoll介绍与代码演示
当有新的客户端连接时,它会接受这个连接,并将新的socket添加到epoll的监视列表中。epoll是为了解决这个问题而出现的。然后,它创建了一个epoll文件描述符,并将服务器的socket添加到epoll的监视列表中。poll是一种比较早的技术,它的工作方式是轮询所有的文件描述符,看哪些文件描述符准备好了I/O操作。这种方式的缺点是,当文件描述符的数量很大时,轮询的开销会很大。这只是一个非常基础的示例,实际的网络编程可能会涉及到更复杂的情况,比如处理客户端断开连接的情况,或者使用非阻塞IO等。原创 2023-08-07 17:42:25 · 493 阅读 · 0 评论 -
google c++线程、协程、任务调度marl库使用介绍
Marl 是一个 C++ 用于多线程并发和异步编程的库。Google 开发了 Marl,旨在为现代 CPU 提供高效的任务调度和同步。Marl 与其他线程库的主要区别在于它的任务调度器,该调度器可以动态地在可用的核心之间分配任务,而不需要为每个任务分配一个专用线程。这使得 Marl 可以在高并发下仍然具有高效性。原创 2023-09-06 23:31:44 · 923 阅读 · 0 评论 -
C++异常介绍与自定义异常
在C++中,自定义异常通常意味着定义一个新的异常类。这个类通常继承自标准库的异常类,例如。定义异常类:创建一个新的类,继承自或其他相关的异常类。提供异常消息:覆盖what()函数,这样当异常被捕获并处理时,可以提供一个描述性的错误消息。抛出自定义异常:在代码的适当位置使用throw关键字抛出自定义的异常。捕获自定义异常:使用try-catch语句块来捕获和处理异常。// 1. 定义异常类private:public:// 2. 提供异常消息try {// 某些条件触发异常。原创 2023-08-25 00:15:06 · 394 阅读 · 0 评论 -
C++ Windows API IsDebuggerPresent的作用
当你在没有附加调试器的情况下运行此程序时,它将输出 “Debugger is not attached.”。例如,恶意软件可能使用这个函数来检测其自身是否被安全研究人员调试,如果是,则可能采取一些措施来干扰调试或直接结束执行。是 Windows API 中的一个函数,它用于检测当前运行的程序是否正在被调试。当程序被如 Visual Studio 这样的调试器附加时,此函数会返回。作为安全机制是不可靠的,因为经验丰富的逆向工程师知道如何绕过这样的检查。原创 2023-08-23 15:58:02 · 230 阅读 · 0 评论