![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++基础
文章平均质量分 60
xiaofeilongyu
这个作者很懒,什么都没留下…
展开
-
TCP的p2p网络模式
Peer-to-Peer,中文译为“对等网络”或“点对点技术”,是一种分布式应用架构,其中每个参与者(称为“节点”)都能够同时作为客户端和服务器,直接与其它节点进行数据交互,而不需要通过中央服务器中转。P2P网络的关键特征是去中心化和资源的分散共享,这使得网络更加健壮,更能适应大规模的数据交换和共享;3、其他状态转换过程。原创 2024-07-05 18:57:52 · 877 阅读 · 1 评论 -
内存池(Memory Pool)
内存池预先从操作系统申请一大块连续内存空间,并将其管理起来,当程序需要分配内存时,不再直接向操作系统请求,而是从内存池中快速分配一小块事先准备好的内存单元。当不再需要这些内存时,也不是直接归还给操作系统,而是归还给内存池,由内存池统一管理,适时或在程序结束时再归还给操作系统。内存池(Memory Pool)是一种内存管理技术,主要用于优化程序中动态内存分配和释放的效率,减少内存碎片,提高程序运行速度。: 释放内存时,不是直接还给系统,而是归还给内存池,可能需要进行合并相邻空闲块的操作以减少碎片。原创 2024-06-11 15:45:51 · 846 阅读 · 0 评论 -
MQTT服务
MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计,特别适用于物联网(IoT)场景中的设备间通信。MQTT的核心组件包括客户端和服务器(也称为代理或经纪人Broker);主要由客户端、服务器、主提、服务质量组成;客户端(Client):可以是发布者、订阅者或同时具备两种角色的设备或应用程序。服务器(Broker)原创 2024-06-06 16:58:20 · 683 阅读 · 0 评论 -
C++内存分析工具
c++ 内存分析工具原创 2023-02-28 10:29:36 · 3120 阅读 · 1 评论 -
跳表简单实现
跳表的简单实现原创 2023-02-28 10:28:29 · 125 阅读 · 1 评论 -
c++ 守护进程
C++守护进程原创 2023-02-28 10:26:38 · 295 阅读 · 0 评论 -
LRU算法
LRU原创 2023-02-28 09:41:23 · 54 阅读 · 0 评论 -
C++ 内存模型
c++ 内存模型原创 2022-12-17 14:25:33 · 1143 阅读 · 1 评论 -
奇异递归模板(CRTP)
奇异递归模板原创 2022-07-11 20:35:14 · 360 阅读 · 0 评论 -
C++的策略模式简单实现
现代c++策略模式原创 2022-06-25 16:40:43 · 221 阅读 · 0 评论 -
cmake
cmakecmake_minimum_required 指定cmake的最小版本要求#CMake最小版本要求2.8.2cmake_minimum_required(VERSION 2.8.2)project 定义工程名称,并指定工程支持的编译语言#指定工程名字和版本号,并指定编译语言project(HELLOWORLD VERSION 1.0.0 LANGUAGES C CXX)显示定义变量#定义src变量,其值为main.cpp hello.cppset(SRC main原创 2022-04-16 17:42:31 · 726 阅读 · 0 评论 -
c++ 多线程锁的应用
c++ 多线程锁的应用在多线程编程中数据的同步尤为重要,锁的使用可以很好的实现数据的同步;常用的有互斥锁,还有其他锁,包括自旋锁、读写锁、和乐观锁等,在不同的场景可以挑选使用不同的锁;一、互斥锁和自旋锁互斥锁和自旋锁时最底层的两种锁,其他高级锁都是基于他们实现的;互斥锁和自旋锁都可以保证在同一时间,只有一个线程可以访问;当有一个线程加锁后,其他线程加锁就会失败;互斥锁和自旋锁在加锁失败后的处理方式不同:互斥锁:加锁失败后,线程会释放CPU,给其他线程使用;自旋锁:加锁失败后,线程会忙等待,不停转载 2021-12-27 16:34:03 · 1064 阅读 · 0 评论 -
正则表达式
正则表达式请添加图片描述. 匹配除“\n”之外的任何单个字符,要匹配包括 ‘\n’ 在内的任何字符,请使用 ‘[.\n]’ 的模式?匹配一次或者0次单个字符,另外所用是非贪婪模式+匹配1次或者多次,等价于{1,}`;*匹配0次或者多次,等价于{0,}`;\b 匹配一个长度为0的字串;\btring\b 匹配以tring为边界的字符串\d 匹配一个数字字符,等价与[0-9]\D 匹配一个非数字字符,等价与[·^0-9]\w 匹配包括下划线在内的任何单词符号,等价与[a-zA-Z0-9]\原创 2021-12-12 15:31:10 · 198 阅读 · 0 评论 -
Linux进程间通信
Linux进程间通信管道、消息队列、共享内存、套接字、信号量共享内存共享内存是操作系统将进程之间共享的数据内存安排为同一块物理内存段,需要使用锁保证数据的一致性创建/获取共享内存(shmget)将共享内存链接到当前进程的地址空间(shmat)通过指针范文共享内训将共享内存从当前进程中分离(shmdt)删除共享内存(shmctl)kill 相关命令[cxl@localhost ~]$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGIL原创 2021-11-25 22:44:19 · 117 阅读 · 0 评论 -
一个简单的单例模板
命名空间的定义头文件mynamespace.h#ifndef _MY_NAME_SPACE_H_#define _MY_NAME_SPACE_H_//定义命名空间#define _MY_NAME_SPACE_START namespace mynamespace{#define _MY_NAME_SPACE_END }#endif单例#ifndef _INSTANCE_H_#define _INSTANCE_H_#pragma once#include <mutex>原创 2021-09-11 16:45:03 · 105 阅读 · 0 评论 -
一个简单的线程池
C++线程池ThreadPool.h#pragma once#include <thread>#include <mutex>#include <memory>#include <vector>#include <list>#include <iostream>#include <condition_variable>using namespace std;class Task{public:原创 2021-08-29 21:15:23 · 167 阅读 · 0 评论 -
c++中前置声明和#include
c++中前置声明和#include能用前置声明的尽量用前置声明,尽可能的避免用#include头文件尽量在cpp文件中包含头文件,而非在头文件中头文件相关若.h文件和cpp文件不在解决方案里:位于其文件中,单独的引用到.h文件会报“error LNK2019:无法解析外部符号”的错误,但是单独引用.cpp文件就可以,include是吧对应的代码直接拷贝过去当.h文件和.cpp文件没有在工程的解决方案里时,#include就是纯粹的拷贝和复制文件源码编译过程:远程序->预处理->转载 2021-08-29 17:24:05 · 1074 阅读 · 0 评论 -
C++对象内存模型
一、虚函数表指针和虚函数表虚函数表指针个数与派生类继承父类个数有关,多一个父类,派生类就多一个虚函数表指针和虚函数表; 派生类和父类同时含有虚函数时,派生类的虚函数按照父类声明的顺序(从左到右),存放在第一个父类的虚函数表后面; 成员变量按照先声明、先存储、先父类、再子类的顺序存放; 无论是派生类还是父类,当出现虚函数(普通虚函数、纯虚函数、虚虚构函数),虚函数表指针放在内存的最前面;二、覆盖和继承派生类和父类出现同名成员变量时,派生类仅仅时将父类的同名承运隐藏了,而非覆盖替换; ...转载 2021-07-14 23:22:26 · 358 阅读 · 0 评论 -
Linux下的Core Dump
Core Dump文件当程序运行过程中异常终止或者崩溃了,操作系统会将当前的内存状态记录下来,保存在一个文件中,这就是Core Dump(核心转储);core文件会包含程序运行时的内存、寄存器状态,堆栈指针,内存管理信息和各种函数调用堆栈信息,可以理解为一个“内存快照”;通过这个core文件可以定位到程序异常退出时对应的堆栈调用信息,找出具体的问题所在。Core Dump相关设置core dump默认是不开启的,可以通过ulimit -c查看是否开启,若输出为0,则没有开启,可使用ulimit -原创 2021-03-15 20:07:53 · 775 阅读 · 0 评论 -
C++ STL容器迭代器失效
vector1、插入(push_back)元素。end操作返回的迭代器失效2、插入(push_back)元素,若发生扩容,即capacity返回值有变化,则需重新加载整个容器,此时begin和end操作返回的迭代器都会失效。3、删除(erase、pop_back)元素,指向删除点的迭代器失效,后面的元素的迭代器也将失效。qeque1、在deque容器首部和尾部插入元素不会使任何迭代器失效;2、在deque容器首部和尾部删除元素,只会使被删除元素的迭代器失效;3、在deque容器的其他位置原创 2021-03-11 14:23:16 · 285 阅读 · 0 评论 -
c++内存空间
一、可执行程序内存分配1、可执行程序内存分段一个可执行程序脚本可以分为3个基本段,代码段,数据段,bss段;unix下可以使用size命令查看可执行文件的段大小信息,size a.outheader->代码text->数据data->bss1、bss(block started by symbol),通常是用来存放程序中未初始化的全局变量和静态变量的存储区域可读写,在程序执行之前bss段会自动请0,所以为初始化去的全局变量的静态变量在程序执行之前已经为0了。数据段存放的是初始原创 2021-03-04 17:29:00 · 645 阅读 · 0 评论 -
C++构造函数初始化列表和构造函数函数体内赋值
C++构造函数初始化列表和构造函数函数体内赋值大多数情况下构造函数初始化列表和构造函数函数体内赋值的效果是一样的,const常量和引用只能使用构造函数的初始化列表的方式进行初始化class A{public: A(int& a, int b, int c): _a(a),_b(b),_c(c) { //_a = a; //错误,引用必须在初始化列表中初始化 //_b = b; //错误,const成员变量必须在初始化列表中初始化 _c = c; //正确,和在初始化列原创 2021-03-04 11:45:42 · 693 阅读 · 1 评论 -
Lambda表达式、std::function、和std::bind函数
Lambda表达式、std::function、和std::bind函数Lambda表达式[capture](parameters) mutable exception->return-type{statement};1、capture:捕获外部变量列表2、parameters:参数列表,如果不需要参数可以省略,“()”可以i一起省略3、mutable:指示符,有来表示是否可以修改捕获的变量;默认Lambda函数是一个const函数;4、exception:异常设定5、return原创 2021-02-09 16:01:44 · 476 阅读 · 1 评论 -
C++1 只能指针enable_shared_from_this
智能指针简介智能指针主要解决动态内存释放问题,采用方式为引入一个计数器;即智能指针中实际有两个指针,故智能指针在内存中的大小时8个字节一个指向资源对象本身(element_type* _Ptr{nullptr}); 一个指向资源对象的引用计数(_Ref_count_base* _Rep{nullptr});该指针中包括连个成员变量_Uses,_Weaks _Uses记录了资源的引用计数,也就是引用资源的shared_ptr 的个数; _Weaks记录了weak_ptr的个数,相当于资源观察者原创 2020-12-29 11:26:39 · 129 阅读 · 0 评论 -
仿函数
仿函数(functor)是通过重载()运算符模拟函数形式的类仿函数不是函数,是个类 反函数重载了()运算符,使得它可以像函数一样调用用最少的箭引爆气球题目链接https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/实例:输入:points = [[10, 16], [2, 8], [1, 6], [7, 12]]输出:2解释:x=6,可以射爆[2, 8]和[1, 6]两个气球,x=11原创 2020-12-25 17:40:45 · 740 阅读 · 0 评论 -
STL相关基础
c++Applicationc++Library(std::allocator)c++promitives(new,new[],new(),::operator new(),...)CRT(malloc/free)O.S.API容器(containers)分配器()迭代器(Iterators)算法(Algorithms)适配器()仿函数(Functors)...转载 2020-12-08 14:15:43 · 138 阅读 · 0 评论 -
单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例只能有一个实例;(禁止拷贝和赋值,静态的实例对象) 必须自己创建这个实例;(私有化构造函数) 必须自己向整个系统提供这个实例。(静态的方法调用构造函数) 多线程使用双重检查确保线程安全。#ifndef __SINGLETON_H__#define __SINGLETON_H__ #include <iostream>#include <string.h>#include <m原创 2020-11-27 17:43:50 · 93 阅读 · 0 评论 -
C++11智能指针
weak_ptr使用时,作为share_ptr的弱引用,期实现依赖于counter的计数器类和share_ptr的复制、构造cunter实现class Counter{public: Counter() : s(0), w(0){}; int s; //share_ptr的引用计数 int w; //weak_ptr的引用计数};share_ptr的简单实现template <class T>class WeakPtr; //为了用we.原创 2020-11-19 09:46:28 · 255 阅读 · 0 评论 -
heap构建
#pragma once#include <vector>#include <iostream>using namespace std;enum heapType{ MAXHEAP, MINHEAP};template<typename T>class MyHeap{private: std::vector<T> _vecdate; int _size;//元素数量 int _capacity;//整个堆的大小 heapTyp.转载 2020-11-13 17:07:55 · 161 阅读 · 0 评论 -
C/C++空指针、NULL、nullptr、0
#ifndef NULL #ifdef __cplusplus #define NULL 0 //C++中使用 #else #define NULL ((void *)0)//C中使用 #endif#endif1、0和NULLNULL是一个宏,0在C和C++中都可以当作空指针常量(null pointer constant),即((void*)0);在C和C++中都就可以使用NULL和0,但是C中通常是NULL,c++.原创 2020-11-10 17:36:21 · 914 阅读 · 0 评论 -
C++模板(泛化),特化,偏特化
1、模板特化按对象类型可分为类模板特化和全局模板函数函数特化;2、按特化类型可分为全特化和偏特化(偏特化包括范围偏特化和参数数量偏特化),全局模板函数不支持偏特化(其实也支持偏特化);3、特化的优先级高于泛化(编译器会先去匹配特化和偏特化,后去匹配泛化)。类模板特化template <typename T1, typename T2>class testFun {public: testFun(T1 t1, T2 t2) : a(t1), b(t2) { cou原创 2020-11-03 11:22:40 · 1814 阅读 · 0 评论 -
二叉树相关操作
节点定义struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x) :val(x), left(NULL), right(NULL);};递归法//前序遍历void preorderTraversal(TreeNode* root, vector<int>& result){ if(root == null) return; result.push_b转载 2020-10-27 14:32:41 · 168 阅读 · 0 评论 -
KMP算法
class KMP{public: void getNext(int* next, const string str) { int j = -1; next[0] = j; for (int i = 1; i < str.size(); i++)// 注意i从1开始 { while (j >= 0 && str[i] != str[j+1])// 前后缀不相同了 { j = next[j];// 向前回溯 } if (st.转载 2020-10-22 16:05:40 · 55 阅读 · 0 评论 -
数字之和
两数之和给定一个整数的数组和一个目标值,在该数组中找出和为目标值的两个整数,并返回数字下标,数字不能重复使用。vector<int> twoSum(vector<int>& nums, int target) { std::unordered_map<int, int> numap; for (int i = 0; i < nums.size(); i++) { auto iter = numap.find(target - nums转载 2020-10-20 15:42:03 · 267 阅读 · 0 评论 -
最小k个数,前k个高频元素
优先队列(内部的一个排序,它本质是一个堆实现的)priority_queue<Type, Container, Functional>Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆//升序队列,小顶堆prio原创 2020-10-14 10:38:06 · 132 阅读 · 0 评论 -
shell脚本基础编程
shell脚本编程#!/bin/bash#variblesnginx_install_doc=/application/nginxproc=nginxnginxd=$nginx_install_doc/sbin/nginxpid_file=$nginx_install_doc/logs/nginx.pid #source function library 调用函数库if [ -f /etc/init.d/functions ];then . /etc/init.d/functions原创 2020-09-10 17:20:46 · 151 阅读 · 0 评论 -
shell脚本
批量创建用户useradd(){pw_txt=`mktemp pw.XXXXX`for i in `seq -s ' ' -w 1 20`do useradd user$idonecat /dev/urandom | strings -8 | egrep "^[a-zA-Z0-9]{8}$" | head -20 >$pw_txtfor i in `seq -s ' ' -w 1 20`do pw=`head -n $i $pw_txt | tail原创 2020-08-18 14:37:34 · 107 阅读 · 0 评论 -
Linux C/C++编译过程
C/C++过程编译的过程.o文件,目标文件,使用gcc或g++编译器,相当于obj文件,保存了编译的时候引用到的符号(函数,全局变量等),这些符号在链接的时候需要使用到 .so文件,shared object共享库(对象),相当于dll动态链接库; .a文件,archive归档包,静态库,多个.o文件打包结果,相当于lib静态链接库 .la文件。libtool archive文件,是libtool自动生成的共享库文件1、预处理:展开头文件、宏定义和条件编译处理等gcc -E source.转载 2020-07-31 17:12:27 · 551 阅读 · 0 评论 -
动态链接库(dll)与静态连接库(lib)
一、前言dll(dynamic)动态链接库,包含多个程序执行的代码和数据,程序运行时是需要使用dll; lib(static)静态链接库,包含dll中各函数的入口信息,在程序编译时用到; 动态连接库可以使设计者隐藏函数的具体实现,便噶增加代码的复用性; 动态链接库参与的程序中,lib文件和dll文件都要用到。二、dll的生成头文件中增加下面几行代码#pragma once#ifdef XXXX_EXPORTS //如果定义了XXXX_EX原创 2020-06-18 11:12:07 · 1428 阅读 · 0 评论 -
Linux GDB调试常用命令
运用run(r),遇到断点处听停止运行,等待下一步命令; continue(c),继续运行到下一个断点或结束; next(n),单步调试,遇到函数调用不进函数体,直接返回结果; step(s),但不调试,遇到函数调用进入函数体; until,在循环体重调试时,可以直接跳出循环体; until+行号,运行至某行; finish,运行程序,知道当前函数结束返回值,打印返回时的堆栈地址和返回值及参数等信息; call 函数(参数),调用程序中可见的函数;quit(q),退出gdb。设置断点原创 2020-05-26 15:39:24 · 402 阅读 · 0 评论