<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[gbbfum的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/gbbfum</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; gbbfum]]></copyright><item><title><![CDATA[字符串前面补零的简单写法]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/131419877</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/131419877</guid><author>gbbfum</author><pubDate>Tue, 27 Jun 2023 16:25:29 +0800</pubDate><description><![CDATA[【代码】字符串前面补零的简单写法。]]></description><category></category></item><item><title><![CDATA[经典内存池的一种技术实现方案]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/123555681</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/123555681</guid><author>gbbfum</author><pubDate>Thu, 17 Mar 2022 17:19:15 +0800</pubDate><description><![CDATA[经典内存池的一种技术实现方案
/*** mempool.h***/
template&lt;int ObjectSize, int NumofObjects=20&gt;
class MemPool {
private:
    const int MemBlockSize;//每个内存块的大小
    const int ItemSize; //每个内存节点的大小
    struct _FreeNode {
        _FreeNode* pNext;
        char data[obje]]></description><category></category></item><item><title><![CDATA[spdlog源码分析（1）]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/122929003</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/122929003</guid><author>gbbfum</author><pubDate>Mon, 14 Feb 2022 17:33:53 +0800</pubDate><description><![CDATA[spdlog几个关键的类logger、sink、registry
logger和sink个类之间是组合关系且是一对多，logger可以有很多sink，如写文件sink，系统syslog的sink，传输的tcp的sink，标准输出stdout的sink等等。
registry类和logger类也是组合关系且是一对多，registry类中用无序map存储logger名和logger的对应关系，根据logger名可以得到logger句柄。rigistry类的目的是对这些logger进行统一的管理。

...]]></description><category></category></item><item><title><![CDATA[C++11/14/17/20特性]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/122882139</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/122882139</guid><author>gbbfum</author><pubDate>Fri, 11 Feb 2022 15:44:42 +0800</pubDate><description><![CDATA[左值引用和右值引用
左值引用只能指向左值，右值引用只能指向右值。可以取地址的是左值，不能取地址的是右值。
左值引用指向右值通过加const修饰，右值引用指向左值需要用到std::move转换。

...]]></description><category></category></item><item><title><![CDATA[C++11简单练习]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/122132655</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/122132655</guid><author>gbbfum</author><pubDate>Fri, 24 Dec 2021 17:26:35 +0800</pubDate><description><![CDATA[#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;map&gt;
#include &lt;vector&gt;
#include &lt;array&gt;
#include &lt;iostream&gt;
#include &lt;memory&gt;

using namespace std;

std::map&lt;int, int&gt; DataMap = {{1, 2}, {3, 4}};

int main(i]]></description><category></category></item><item><title><![CDATA[C++链接C库头文件里面需使用extern “C“]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/120323024</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/120323024</guid><author>gbbfum</author><pubDate>Thu, 16 Sep 2021 10:05:29 +0800</pubDate><description><![CDATA[C++链接C库，C代码的头文件中需要包含：
#ifdef __cplusplus
extern "C" {
#endif

代码断

#ifdef __cplusplus
}
#endif


]]></description><category></category></item><item><title><![CDATA[C++拷贝构造函数和赋值构造函数]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/120044405</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/120044405</guid><author>gbbfum</author><pubDate>Wed, 01 Sep 2021 17:18:04 +0800</pubDate><description><![CDATA[typedef struct Test
{
    char a;
    int b;
    short c;
    double d;
    std::string str;
    Test()
    {
        a = 0;
        b = 0;
        c = 0;
    }
    Test(const Test&amp; aoTest)
    {
        printf("test copy\n");
        str = aoTest.str;]]></description><category></category></item><item><title><![CDATA[减少代码重复率的方法]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/117923476</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/117923476</guid><author>gbbfum</author><pubDate>Tue, 15 Jun 2021 14:09:57 +0800</pubDate><description><![CDATA[1、使用设计模式。设计模式的可以提高代码的复用率，减少代码的重复度。
2、使用类模板或者函数模板，所谓的泛型编程。

]]></description><category></category></item><item><title><![CDATA[How to reduce the number of bugs when coding ?]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/117710274</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/117710274</guid><author>gbbfum</author><pubDate>Tue, 08 Jun 2021 17:27:55 +0800</pubDate><description><![CDATA[写设计文档能帮助自己理清设计思路，如果设计到修改原有代码，一定要关注到原有代码的逻辑闭合，否则造成的后果是加功能引入了BUG。作设计的时候要考虑到各种场景和约束。
单元测试一定要做到位，程序员自己测试可以做到白盒测试去覆盖每一个分支。程序员有时候偷懒就可能遗留BUG，这个测试人员不一定能发现。


...]]></description><category></category></item><item><title><![CDATA[双端链表的另类定义方式]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/117527679</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/117527679</guid><author>gbbfum</author><pubDate>Thu, 03 Jun 2021 16:37:56 +0800</pubDate><description><![CDATA[通常在定义结构体的链表的时候一般这样定义
typedef struct TDataNode
{
int data;
TDataNode *pre;
TDataNode *next;
}TDataNode;
还有一种方式在其它代码里面有看到：
typedef struct TList
{
TList* pre;
TList* next;
}TList;
typedef struct TDataNode
{
int data;
TList list;
}TDataNode;
TList可以单独作为一个链表，这个]]></description><category></category></item><item><title><![CDATA[双缓冲区]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/117121535</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/117121535</guid><author>gbbfum</author><pubDate>Fri, 21 May 2021 14:47:07 +0800</pubDate><description><![CDATA[通常对同一块数据读写需要加锁，如果写的情况多且比较耗时的话，那读的时候就比较慢。所有这时候可以考虑用双缓冲区用指针切换，虽然切换的时候也需要加读写锁，但是提升效率是明显的。
...]]></description><category></category></item><item><title><![CDATA[归并排序]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115764176</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115764176</guid><author>gbbfum</author><pubDate>Fri, 16 Apr 2021 15:53:46 +0800</pubDate><description><![CDATA[void merge(int array[], int left, int mid, int right, int temp[])
{
    int i = left;
    int j = mid + 1;
    int k = 0;
    while(i &lt;= mid &amp;&amp; j &lt;= right)
    {
        if (array[i] &lt;= array[j])
        {
            temp[k++] = array[i++]]></description><category></category></item><item><title><![CDATA[插入排序（插入和希尔排序）]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115753443</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115753443</guid><author>gbbfum</author><pubDate>Fri, 16 Apr 2021 11:51:17 +0800</pubDate><description><![CDATA[void insertSort(int array[], int len)
{
    int key, j;
    for (int i = 1; i &lt; len; i++)
    {
       key = array[i]; //要插入的元素
       j = i-1;//已经有序末尾元素索引
       while(j &gt;=0 &amp;&amp; key &lt; array[j])//找到合适位置
       {
           array[j] = array[]]></description><category></category></item><item><title><![CDATA[选择类排序（选择排序和堆排序）]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115732091</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115732091</guid><author>gbbfum</author><pubDate>Thu, 15 Apr 2021 17:45:02 +0800</pubDate><description><![CDATA[void selectSort(int array[], int len)
{
    for (int i = 0; i &lt; len; i++)
    {
        int min = i;
        for (int j = i+1; j &lt; len; j++)
        {
            if (array[j] &lt; array[min])
            {
                min = j;
            }
    ]]></description><category></category></item><item><title><![CDATA[交换类排序（冒泡和快排）]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115723051</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115723051</guid><author>gbbfum</author><pubDate>Thu, 15 Apr 2021 14:13:10 +0800</pubDate><description><![CDATA[//填坑和分治的思想，和基准值比较，比基准值大的放在它的右边，比基准值小的放在它的左边
void quickSort(int array[], int low, int high)
{
    if (low &gt;= high)//递归的终止条件
    {
        return;
    }
    int i = low;
    int j = high;
    key = array[i];
    while (i &lt; j)
    {
        while (i &l.]]></description><category></category></item><item><title><![CDATA[C++责任链模式例子]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115701161</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115701161</guid><author>gbbfum</author><pubDate>Wed, 14 Apr 2021 15:57:14 +0800</pubDate><description><![CDATA[责任链模式，模拟请假的审批流程，主管批准小于等于3天的，经理批准小于七天的，总经理批准大于等于7天。
chain.h
#include &lt;string&gt;
typedef struct LeaveReq
{
    std::string moName;
    int miNumOfDays;
}LeaveReq;

class CHandler
{
public:
    CHandler(std::string aoName): moName(aoName){}
    virtual ~C]]></description><category></category></item><item><title><![CDATA[C++命令模式例子]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115668715</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115668715</guid><author>gbbfum</author><pubDate>Tue, 13 Apr 2021 15:16:48 +0800</pubDate><description><![CDATA[命令模式将调用操作的对象和知道如何实现该操作的对象解耦。
command.h
#include "receiver.h"
class ICommand
{
public:
    ICommand(){}
    virtual ~ICommand(){}
    virtual void execute() = 0;
};

class COpenSwitchCommand : public ICommand
{
public:
    COpenSwitchCommand()
    {
       ]]></description><category></category></item><item><title><![CDATA[C++中介者模式例子]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115657021</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115657021</guid><author>gbbfum</author><pubDate>Tue, 13 Apr 2021 10:46:08 +0800</pubDate><description><![CDATA[中介者模式将多对多的交互简化为一对多的交互，引入一个中介者使其对象耦合松散，而且可以独立的改变它们之间的交互。
mediator.h
#include &lt;vector&gt;
class CPerson;
class CMediator
{
public:
    CMediator(){}
    virtual ~CMediator(){}
    void Register(CPerson* aoPerson);
    CPerson* FindPartner(CPerson* aoPerso]]></description><category></category></item><item><title><![CDATA[C++观察者模式例子]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115625647</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115625647</guid><author>gbbfum</author><pubDate>Mon, 12 Apr 2021 15:52:11 +0800</pubDate><description><![CDATA[观察者模式定义了对象间一对多的依赖关系，一个目标可以有任意数目的与之相依赖的观察者，一旦观察目标的状态发生改变，所有的观察者都将得到通知。
observer.h
#include &lt;string&gt;
#include &lt;stdio.h&gt;
class CSubject;
class CObserver
{
public:
    CObserver(){}
    virtual ~CObserver(){}
    virtual void Update(CSubject* apoSu]]></description><category></category></item><item><title><![CDATA[C++状态模式例子]]></title><link>https://blog.youkuaiyun.com/gbbfum/article/details/115554849</link><guid>https://blog.youkuaiyun.com/gbbfum/article/details/115554849</guid><author>gbbfum</author><pubDate>Fri, 09 Apr 2021 17:06:23 +0800</pubDate><description><![CDATA[class CContext;
class CState
{
public:
    CState(){}
    virtual ~CState(){}
    virtual void Execute(CContext* apcContext) = 0;
    virtual std::string GetState() = 0;
};

class CStateB;
class CStateA : public CState
{
public:
    CStateA(){}
    virtual]]></description><category></category></item></channel></rss>