
c++
文章平均质量分 60
黑猫爱小鹿
这个作者很懒,什么都没留下…
展开
-
大小端详解
编程基础知识之大小端原创 2022-06-09 21:16:40 · 261 阅读 · 1 评论 -
C++函数返回优化
C++函数返回优化我们知道,函数运行结束后,函数内部的局部变量就会消失,当函数返回的对象的时候,会产生一个临时对象,这样会消耗很多的计算资源,写一段代码进行测试。#include <iostream>using namespace std;class MyBuff { public: MyBuff() { cout << "MyBuff()" << endl; } MyBuff(const MyBuff& b) = delete;原创 2022-05-16 09:48:20 · 401 阅读 · 0 评论 -
va_list可变参数的秘密
va_list可变参数的秘密文章目录va_list可变参数的秘密内部实现原理使用步骤例子我们知道在c++里面,如果无法确认传入的参数个数以及类型的时候,那么可以使用省略号来指定参数列表比如void fun1(int a, ...)void fun2(...)其中比较典型的就是printf函数printf (const char *__restrict __fmt, …)调用printf(“ssss %d”,10)那么其函数内部实现的是如何的值得注意的是\1. 变参处的定义原创 2022-01-08 17:08:48 · 739 阅读 · 1 评论 -
无向图算法之CC算法
CC算法算法实现#include "graph.h"/* CC算法比union-find算法更慢.CC算法需要构建好一幅图 但是union-find算法是一种动态算法,可以在添加边的时候去检查两个顶点是否连通 */class CC { // 其实就是计算连通分量 public: CC(Graph G) { marked_.resize(G.V(), false); id_.resize(G.V()); for (int i = 0; i <原创 2022-01-07 15:29:42 · 894 阅读 · 0 评论 -
每日算法学习之并查集(全网最详细)
并查集文章目录并查集作用原理实现优化路径压缩作用并查集能够解决图论中的动态连通性的问题什么是动态连通性满足下面三个特点自反性 节点p 节点q连通对称性 如果节点p节点q连通那么节点 q和节点p也连通传递性 节点a 节点b连通 节点b 节点c连通 那么 节点a 节点c连通原理视频链接文章链接其实原理也是很简单的首先维护一个parent[]的数组,数组的含义就是parent[i]代表 i的父节点是parent[i]初始化的时候大家都各自为政,所有人都是自己的父节点paren原创 2021-12-24 14:52:04 · 580 阅读 · 0 评论 -
pkg-config到底是个啥
Pkg-config到底是个啥文章目录Pkg-config到底是个啥使用方法makefile中使用pkgconfig如何编写PC文件参考????Pkgconfig其实跟使用的CMakeList文件中的配置文件作用是一样的,都是为了在需要使用第三方头文件或库文件的时候告诉编译器头文件和库文件的位置百度百科的解释是pkg-config 是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X原创 2021-12-19 19:56:35 · 1297 阅读 · 0 评论 -
手把手教学前缀树
前缀树应用前缀匹配词频统计数据结果root节点 root = Trie()孩子节点 HashMap<char,Trie> children结束FLag bool isEnd/isword 判断是否是数字对应的值 string val题目推荐leetcode 208leetcode 720leetcode 692208. 实现 Trie (前缀树)难度中等923Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符原创 2021-10-22 10:02:25 · 151 阅读 · 0 评论 -
内存池详解
内存池详解文章目录内存池详解概念分配内存的过程内存的释放内存池的优缺点概念如图所示,内存池可以减少大量的调用new malloc产生的空间碎片,提高内存的利用率在STL中一共有两级空间分配器,内存池就是实现在二级空间分配器当中的内存池里面一共维持中16根链表,每一个链表负责特定大小的空间区块,从8byte到128byte分配内存的过程当我们传入一个字节的参数表示我们所需要的内存的大小的时候,自动校对到第几号链表,比如13byte会分配16byte,找到对应的几号链表以后判断链表是否为空,原创 2021-09-24 09:40:03 · 504 阅读 · 0 评论 -
c++11新特性之完美转发(std::foward)
完美转发文章目录完美转发引用折叠引用折叠也就是在c++11里面是没有引用的引用的T& &r=x这时候会发生引用折叠也就是一般发生在模板实例化auto decltype typedef的语境中引用折叠的规则所有的右值引用折叠到右值引用上还是一个右值引用所有的其他引用的折叠都会变成左值引用,也就是说,左值引用具有传染性,粘上一个左值引用那就是左值引用了所以有个概念叫做万能引用(1)当万能引用(T&& param)绑定到左值时,由于万能引用也是一个引用原创 2021-09-10 09:22:39 · 318 阅读 · 0 评论 -
类对象只在栈或者堆里面创建
类对象只在堆或者栈里面创建文章目录类对象只在堆或者栈里面创建类对象只在栈里面创建类的对象只在堆里面创建构建对象有两种方式方法, 第一: 静态构建 A a 第二: 动态构建 调用new类对象只在栈里面创建如果要在栈里面创建,那么就必须采用静态构建对象的方法,也就是直接调用构造函数禁用new运算符将operator new 和 operator delete设置为私有的类的对象只在堆里面创建只在堆里面创建,就是说不能直接调用构造函数,只能调用new进行对象的创建把类的构造函数原创 2021-09-01 16:40:57 · 250 阅读 · 0 评论 -
手把手带你手撕差分
手把手带你手撕差分文章目录手把手带你手撕差分概念例题[1109. 航班预订统计](https://leetcode-cn.com/problems/corporate-flight-bookings/)概念例题1109. 航班预订统计难度中等206这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 fir原创 2021-08-31 11:03:05 · 113 阅读 · 0 评论 -
手把手教学堆排序
手把手教学堆排序文章目录手把手教学堆排序堆排序的一般步骤手动模拟建堆的过程c++代码实现堆排序的一般步骤用数组表示二叉树(完全二叉树,也就是插入的顺序必须是从左到右从上到下),同时进行建堆堆顶的元素与堆最后一个元素交换,断开最后一个的链接,维护剩下的n-1个堆再对剩下的n-1个元素进行步骤2重复到堆里面只有一个元素,或者没有元素为止Tip 数组表示二叉树,下标为i的父节点是 (i-1)/2 下标为i的左子节点是 i*2+1 下标为i的右子节点是 i*2+2建堆的时间复杂度是 O(原创 2021-08-30 19:00:35 · 176 阅读 · 0 评论 -
手动实现atoi
手动实现atoi文章目录手动实现atoi关键在于异常,过滤空格,过滤小数点,更新状态#include <string.h>#include <exception>#include <iostream>#include <stdexcept>using namespace std;enum class State { NORMAL, ABNORMAL };State state;int My_atoi(const char* d原创 2021-08-29 17:11:41 · 181 阅读 · 0 评论 -
自己实现智能指针
自己实现智能指针#include <utility>using namespace std;template <class T>class MyUniquePtr { public: // 默认构造函数 explicit MyUniquePtr(T* p = nullptr) noexcept { myptr_ = nullptr; } // 移动构造 explicit MyUniquePtr(MyUniquePtr&& p) noexc原创 2021-08-29 09:53:02 · 205 阅读 · 0 评论 -
多线程顺序执行实现方式
多线程顺序执行实现方式文章目录多线程顺序执行实现方式方式一 互斥锁方式二 信号量方式一 互斥锁#include <time.h>#include <unistd.h>#include <iostream>#include <mutex>#include <thread>using namespace std;int flag = 1;mutex mtx;void PrintA() { for (;;) {原创 2021-08-23 16:09:42 · 195 阅读 · 0 评论 -
手把手带你手撕HashMap
文章目录HashMap的优缺点怎么解决hash冲突手撕hashmapHashMap的优缺点优点增删查找时间复杂度o(1)缺点key不能重复,在数据很多相同的时候不适合里面的内容是随机的不是有序的,所以面对有序的处理不行,比如说顺序输出还有就是要知道数组开辟的大小,如果开辟小了,hash冲突的很严重那么链表查询的时候时间就会增加,这时候就要扩容,那么里面所有的hash都需要重新进行hash存储了怎么解决hash冲突开放地址法 (冲突了往下找)链表法 (数组里面放的是链表,这也是我原创 2021-08-06 16:39:02 · 402 阅读 · 0 评论 -
源码分析for_each,unique,stable_sort,find_if
源码分析for_each,unique,stable_sort,find_if文章目录源码分析for_each,unique,stable_sort,find_ifuniqueunique的源码解析for_each()find_ifuniquelinklink2这个函数只能对"相同元素在并邻在一块的"序列进行去重. 不能对相同元素七零八落地分布的一般序列进行去重, 可以对一般数组进行排序后再用unique()实现去重目的即可, 因为排好序的的序列里面相同元素一定存储在连续的地址块. 提醒, 该函数原创 2021-08-04 14:01:13 · 170 阅读 · 0 评论 -
带你手撕前缀和
带你手撕前缀和文章目录带你手撕前缀和参考构造二维前缀和的三种方法例题参考linklink1构造二维前缀和的三种方法先计算第一行与第一列再进行别的计算先固定行计算每一行的前缀和,再固定相应行的列的前缀和增加一维直接计算 pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+data[i][j]不说了上代码// 这里讲的是二维的差分数组的应用#include <iostream>#include <vector>原创 2021-07-30 22:04:01 · 106 阅读 · 0 评论 -
怎么用数组表示二叉树
怎么用数组表示二叉树数组怎么表示二叉树如果父节点的下标是i那么左子节点的下标i*2+1右子节点的下标的i*2+21104. 二叉树寻路难度中等99在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是原创 2021-07-29 10:40:41 · 3129 阅读 · 1 评论 -
手撕线程池
手撕线程池文章目录手撕线程池代码std::functionstd::forwardlock_guard与unique_lock的区别lock_guardunique_lock代码#include <assert.h>#include <condition_variable>#include <functional>#include <memory>#include <mutex>#include <queue>#in原创 2021-07-28 14:12:25 · 294 阅读 · 0 评论 -
c++之malloc底层实现
malloc底层实现文章目录malloc底层实现首先讲一下malloc这个函数相关函数malloc分配规则内存池首先讲一下malloc这个函数void* malloc(size_t size);malloc是c里面的函数,调用时候需要显示的指定分配空间的大小,分配成功会返回void *的指针,需要自己进行强制转换,不安全,失败返回NULL相关函数int brk(const void *addr)函数是为了扩展heap的上界brk的。0成功 -1失败void* sbrk(intpr原创 2021-07-26 17:24:57 · 1781 阅读 · 4 评论 -
带你手撕单调栈(二)
带你手撕单调栈(二)思路请看描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1输入:[3,1,2,5,2,4] 复制返回值:5 复制说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 示例2输入:[4,5,1,3,2]返回值:2 class Solution {public: /** * max wa原创 2021-07-23 09:58:08 · 201 阅读 · 0 评论 -
extern C的前世今生
extern C的前世今生文章目录extern C的前世今生**extern "C"的前世今生**==为什么不把include放进extern C中==extern "C"的主要作用就是为了==能够正确实现C++代码调用其他C语言代码。==加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类原创 2021-07-22 14:41:44 · 113 阅读 · 0 评论 -
带你手撕单调栈(一)
单调栈文章目录单调栈是么时候用单调栈怎么用好单调栈模板例题[739. 每日温度](https://leetcode-cn.com/problems/daily-temperatures/)正序倒序+哨兵[496. 下一个更大元素 I](https://leetcode-cn.com/problems/next-greater-element-i/)前序遍历后序遍历+哨兵是么时候用单调栈一定要记住的是数据结构一定是辅助我们解题的,一定是在暴力解法的方式下进行优化(其实也就是以空间换时间)单调栈一定要符原创 2021-07-21 16:49:26 · 233 阅读 · 0 评论 -
前缀和与差分
前缀和与差分文章目录前缀和与差分前缀和[523. 连续的子数组和](https://leetcode-cn.com/problems/continuous-subarray-sum/)解法一解法二差分前缀和前缀和的优势:以(o1)的时间复杂度得到某块区间的总和523. 连续的子数组和难度中等262给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true原创 2021-07-12 10:18:01 · 96 阅读 · 0 评论 -
统计整数转换二进制后含有多少个1
统计整数转换为二进制后含多少个1 的问题文章目录统计整数转换为二进制后含多少个1 的问题整数右移整数 与 左移的1 相&减1再相&处理二进制的类`bitset`string 与 int 湘湖转换整数右移但不适用负数,当x为负数时,一直进行右移运算,最终这个数字会编程0XFFFFFFFF,从而陷入死循环int getNumber(int x){ int count = 0; while(x) { count += x & 1;原创 2021-07-12 10:15:51 · 175 阅读 · 0 评论 -
动手操作Gtest
gtestgtest其实也就是一个外部的链接库也是生成一个test的可执行文件代码如下test_d435.h#ifndef _TEST_TEST_D435_H_#define _TEST_TEST_D435_H_#include <gtest/gtest.h>#include <opencv2/opencv.hpp>#include <vector>#include "../realsense/common_op.h"#include "../原创 2021-07-12 10:14:14 · 210 阅读 · 0 评论 -
c++ 判断文件存在方法
一般方法一般而言,下述方法都可以检查文件是否存在:使用ifstream打开文件流,成功则存在,失败则不存在以fopen读方式打开文件,成功则存在,否则不存在使用access函数获取文件状态,成功则存在,否则不存在使用stat函数获取文件状态,成功则存在,否则不存在代码如下:#include <sys/stat.h>#include <unistd.h>#include <string>#include <fstream>inlin原创 2021-07-12 10:13:01 · 2847 阅读 · 0 评论 -
c++ 不完全类型
简介在一个给定的源文件中,一个类只能被定义一次,如果在多个文件中定义一个类,那么每个文件中的定义必须是完全相同的将类定义放在头文件中,可以保证在每个使用类的文件中以同样的方式定义类。使用头文件保护符,来保证即使头文件在同一个文件中被包含多次,类定义也只出现一次。只声明却没有定义的类称为—————–不完全类型,不完全类型不能定义该类型的对象,只能用于定义指向该类型的指针及引用,或者用于声明(不是定义)使用该类型作为形参类型或返回类型的函数。在创建类的对象之前,必须完整地定义该类。必须定原创 2021-07-12 10:12:08 · 660 阅读 · 0 评论 -
编译的详细过程
编译的详细过程预编译编译汇编链接.h .c .cpp (源代码)------> .i (预处理后源代码) ----------> .S (汇编代码)--------->.O (中间文件) ----------> .out .exe上面四个步骤都在干什么预编译删除注释添加行号和文件标识执行编译器命令删除所有#define 并进行展开展开include(递归展开)处理所有预编译命令#if #ifndef等编译语义分析 : 判断表达式是否有原创 2021-07-11 17:10:33 · 926 阅读 · 0 评论 -
C++ STL之详解String
C++ STL之详解String构造析构这个就不进行解释元素访问atoprerator []frontbackdatac_str重点讲一下 at [] data ctr==at和[]==都是用下标来进行访问,不同的点在于at会进行下标的检查,看是否越界,如果越界会抛出异常,[]不会进行检查data(): 返回指向字符串的首字符的指针c_str(): 与data()很相似,不同点在于,c_str()返回的是const类型的不可以修改迭代器begi原创 2021-07-10 17:46:25 · 146 阅读 · 0 评论 -
手撕排序算法(下)
排序算法(下)文章目录排序算法(下)快速排序快速排序是原地排序吗快速排序是稳定的排序算法吗快速排序算法的时间复杂度度算法实现归并排序归并排序是原地排序吗归并排序是稳定的排序算法吗归并排序算法的时间复杂度度算法实现快速排序快排的思想是这样的:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数原创 2021-07-09 10:54:28 · 107 阅读 · 0 评论 -
C++面经计算机网络-------------详解TCP与UDP
详解TCP与UDPTCP与UDP区别TCP(Transmission Control Protocol)传输控制协议是面向连接的,提供可靠的,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),只提供点到点一对一之间的通信UDP(User Datagram Protocol)用户数据报协议是无连接的,尽最大可能交付,没有拥塞控制,面向报文的(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多原创 2021-07-08 16:47:19 · 628 阅读 · 0 评论 -
C++面经之----------内存对齐
内存对齐文章目录内存对齐为什么需要内存对齐结构体对齐规则结构体大小计算大小三部曲第一步:找出每个成员变量的大小将其与编译器的默认对齐数相比较,取其较小值为该成员变量的对齐数第二步:根据每个成员对应的对齐数画出它们在内存中的相对位置第三步:通过最大对齐数决定最终该结构体的大小变量类型占用内存大小为什么需要内存对齐尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度.现在考虑4原创 2021-07-05 14:07:38 · 951 阅读 · 4 评论 -
手撕排序算法(上)
排序算法(上)文章目录排序算法(上)算法指标冒泡排序冒泡排序是原地排序吗冒泡排序是稳定的排序算法吗冒泡排序算法的时间复杂度度算法实现插入排序插入排序是原地排序算法吗插入排序是稳定的排序算法吗插入排序算法的时间复杂度度算法实现选择排序选择排序是原地排序算法吗选择排序是稳定的排序算法吗选择排序算法的时间复杂度度算法实现总结算法指标时间复杂度空间复杂度(是否是原地排序)算法的稳定性仅仅用执行效率和内存消耗来衡量排序算法的好坏是不够的。针对排序算法,我们还有一个重要的度量指标,稳定性。这个概念是说,原创 2021-07-05 10:32:10 · 112 阅读 · 0 评论 -
C++-----------------数据结构优先队列
优先队列文章目录优先队列定义:priority_queue在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。参考堆就是如下二叉树,原创 2021-06-24 16:07:36 · 134 阅读 · 0 评论 -
C++之------------析构函数
析构函数参考链接参考链接文章目录析构函数什么是析构函数什么时候会调用析构函数继承构造与析构列表初始化成员变量结论什么是析构函数析构函数为成员函数的一种,名字与类名相同,在前面加‘~’没有参数和返回值在C++中“~”是位取反运算符。一个类最多只能有一个析构函数。析构函数不返回任何值,没有函数类型,也没有函数参数,因此它不能被重载。构造函数可能有多个,但析构函数只能有一个,就像人来到人世间,可能出生的环境家庭不同(重载构造函数),但最终都会死亡(析构函数)什么时候会调用析构函数(1)如果在原创 2021-06-20 19:39:58 · 396 阅读 · 0 评论 -
数据结构之----------单调队列
单调队列单调队列的作用就是维持某一个区间的最值其中有两个版本根据下标来进行维护单调队列根据值来维护单调队列239. 滑动窗口最大值难度困难1036给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置原创 2021-06-20 14:52:52 · 120 阅读 · 0 评论 -
C++ 优先队列
优先队列文章目录优先队列定义:priority_queue在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。参考堆就是如下二叉树,转载 2021-06-18 14:28:46 · 318 阅读 · 0 评论 -
std::cin详解
std::cin文章目录std::cincin>>从标准输入读取一行字符串的方法getline读取一行例如cin>>cin>> 用于连续从键盘中读取想要的数据以,空格;tab;换行作为分隔符cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘原创 2021-06-09 19:58:43 · 9021 阅读 · 2 评论