<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[M_Alan_walker的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/M_Alan_walker</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; M_Alan_walker]]></copyright><item><title><![CDATA[计算岛屿的数量]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115421245</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115421245</guid><author>M_Alan_walker</author><pubDate>Sat, 03 Apr 2021 21:37:36 +0800</pubDate><description><![CDATA[给一个二维数组,元素只有0和1,1代表岛屿,0代表海水,如果与1相邻的位置还是1,这一片1仅代表一个岛屿,计算岛屿的数量


/*
 [[1,1,0,0,0],
  [0,1,0,1,1],
  [0,0,0,1,1],
  [0,0,0,0,0],
  [0,0,1,1,1]]  岛屿数量是3三个
*/

上述例子中就只包含了三个岛屿.

解题思路:如果遍历到当前元素是1,岛屿数量+1,然后在深度优先遍历它上下左右四个位置的元素,把与它相邻且为1的元素都置为0


int solve(std::vecto]]></description><category></category></item><item><title><![CDATA[c++11实现简单的生产者消费者任务模型]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115409803</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115409803</guid><author>M_Alan_walker</author><pubDate>Fri, 02 Apr 2021 23:44:32 +0800</pubDate><description><![CDATA[生产者消费者模型是多线程同步的一个典型例子,运用锁和条件变量对两个线程做同步处理.


#include &lt;iostream&gt;           
#include &lt;queue&gt;
#include &lt;thread&gt;             
#include &lt;mutex&gt; 
#include &lt;unistd.h&gt;             
#include &lt;condition_variable&gt; 
using namespace]]></description><category></category></item><item><title><![CDATA[c++11实现一个线程池,多任务的分配与调度]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115386283</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115386283</guid><author>M_Alan_walker</author><pubDate>Thu, 01 Apr 2021 22:28:57 +0800</pubDate><description><![CDATA[什么是线程池?

线程池是一种线程使用模式.线程过多或者频繁的创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着管理器分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性.线程迟不仅能保证内核的充分利用,还能防止过分调度.

线程池原理

预先创建预定数量的线程,将多个任务加入到任务队列,类似于生产者消费者,多个线程相当于消费者,一个任务队列充当生产者.当任务队列被塞入任务时,线程们就去竞争这些任务,但当每次只有一个线程能够得]]></description><category></category></item><item><title><![CDATA[c++给定一个数组,里面的元素都各不相同,判断其是否为一个二叉搜索树的后序遍历]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115335938</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115335938</guid><author>M_Alan_walker</author><pubDate>Tue, 30 Mar 2021 21:16:33 +0800</pubDate><description><![CDATA[二叉搜索树:根节点的值大于左子节点的值,小于右子节点的值,并且其左右子树也是一个二叉搜索树;

后序遍历:左-&gt;右-&gt;根

思路就是:数组中最后一个元素显示就是根节点,然后根据大小关系,把数组分为左右子树,再做遍历即可;


bool isBstPost(std::vector&lt;int&gt;&amp; array) {
    int length = array.size();
    if(length == 0)
        return false;
    
    int]]></description><category></category></item><item><title><![CDATA[利用c++设计实现一个LRU缓存]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115290097</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115290097</guid><author>M_Alan_walker</author><pubDate>Sun, 28 Mar 2021 23:13:07 +0800</pubDate><description><![CDATA[利用c++设计实现一个LRU缓存

LRU（Least recently used，最近最少使用）算法根据数据的历史访问记录来进行淘汰数据，其核心思想是“如果数据最近被访问过，那么将来被访问的几率也更高”

主要提供两个对外的接口,一个是getVal(key),根据key在缓存找对应的val值;一个是setVal(key,val)向lru缓存中插入一个val.

设计思具体是利用hash_map保存key和对应的val值,因为要考虑删除最久未使用的key和把当前使用的key置换成最新的key,因此val的设]]></description><category></category></item><item><title><![CDATA[给定一个整数数组，数组中有正负数随机分布，要求将正数负数间隔分布，且不改变其原来的顺序。]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115258258</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/115258258</guid><author>M_Alan_walker</author><pubDate>Sat, 27 Mar 2021 00:53:05 +0800</pubDate><description><![CDATA[给定一个整数数组，数组中有正负数随机分布，要求将正数负数间隔分布，且不改变其原来的顺序。

例如【1， 2， 3， -2， -4， -6， 7， 8】 =&gt; 【1，-2， 2， -4， 3， -6， 7， 8】

思路1:开辟一个O(n)的空间,定义两个下标,一个指向正数,一个指向负数,分别按照正负的顺序push_back到新数组里面即可;

思路2:不开辟0(n)的空间,先对原数组进行一个操作,将正数排在负数的后面,然后依次挪动负数即可;思路二代码如下:


//给一个有正负数的数组,让正数排在负数]]></description><category></category></item><item><title><![CDATA[两个QListWidget相互拖拽item，并删除对应的item]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108545337</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108545337</guid><author>M_Alan_walker</author><pubDate>Sat, 12 Sep 2020 10:01:07 +0800</pubDate><description><![CDATA[qt的QListWidget有选择拖拽的属性， list1-&gt;setDragEnabled(true):可拖拽list2-&gt;setAcceptDrops(true):接受拖拽；这样简单设置之后能满足我们的需求，但会有一个问题，就是从list1拖拽到list2的item拖拽动作完成后这个item还依旧在list1上面，为了解决这个问题，我们可以写一个自己的QListWidget类,先看下效果:



先看myQlistWidget的声明：


class myQlistWidget : pu...]]></description><category></category></item><item><title><![CDATA[递归反转单链表]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108517224</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108517224</guid><author>M_Alan_walker</author><pubDate>Thu, 10 Sep 2020 16:20:58 +0800</pubDate><description><![CDATA[采用递归实现这个过程，先找到链表的最后一个节点然后向前返回NULL跟next的值即可：


struct ListNode{
    int value;
    ListNode *next;
}; 

ListNode* reverseList(ListNode *head){
    if(head == NULL || head-&gt;next == NULL)
        return head;
    else{
        ListNode* newHead = reverse..]]></description><category></category></item><item><title><![CDATA[考虑可选的 virtual functions（虚拟函数）的替代方法]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108452547</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108452547</guid><author>M_Alan_walker</author><pubDate>Tue, 08 Sep 2020 08:54:19 +0800</pubDate><description><![CDATA[现在你工作在一个视频游戏上，你在游戏中为角色设计了一个 hierarchy（继承体系）。你的游戏中有着变化多端的恶劣环境，角色被伤害或者其它的健康状态降低的情况并不罕见。因此你决定提供一个 member function（成员函数）healthValue，它返回一个象征角色健康状况如何的整数。因为不同的角色计算健康值的方法可能不同，将 healthValue 声明为 virtual（虚拟）似乎是显而易见的设计选择：


class GameCharacter {
public:
  virtual int ]]></description><category></category></item><item><title><![CDATA[c++异常安全的代码]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108384544</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108384544</guid><author>M_Alan_walker</author><pubDate>Thu, 03 Sep 2020 15:52:11 +0800</pubDate><description><![CDATA[假设有一个类，代表有背景图像的GUI菜单，这个类被设计成在多线程环境中使用，所以它有一个用于并行控制的互斥体(mutex):


class PrettyMenu {
public:
  ...
  void changeBackground(std::istream&amp; imgSrc);           // change background
  ...                                                    // image

private:
]]></description><category></category></item><item><title><![CDATA[c++减少函数返回值为引用]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108328364</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108328364</guid><author>M_Alan_walker</author><pubDate>Tue, 01 Sep 2020 10:59:55 +0800</pubDate><description><![CDATA[首先函数参数作为引用来替代值传递会提高效率这是必然的，那么函数的返回值可以是引用吗？先看一个代表有理数的类，包含一个将两个有理数相乘的函数：


class Rational {
public:
  Rational(int numerator = 0,               
           int denominator = 1);            

  ...

private:
  int n, d;                                 

frien]]></description><category></category></item><item><title><![CDATA[c++两个普通类利用回调函数传递信息]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108320295</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108320295</guid><author>M_Alan_walker</author><pubDate>Mon, 31 Aug 2020 14:42:29 +0800</pubDate><description><![CDATA[如果要在两个class对象之间传递数据，最简单直接的方法在一个类中定义一个全局变量，然后在另一个类里面export这个变量，这样就等于这个全局变量同时作用于两个类对象中，这样做能暂时解决问题，然而可能会出现新的问题，比如，代码的复用性不好，全局变量会在main之前初始化，增加了程序的负担；还有一个致命的问题，如果是多线程程序，就需要加锁保持同一时刻只能有一个对象在访问修改这个全局变量，程序的效率可能会下降，当然如果定义的全局变量过多，由于加锁不慎很可能会导致死锁，致使程序奔溃，今天介绍一中很实...]]></description><category></category></item><item><title><![CDATA[TCP-简单介绍]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108102669</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/108102669</guid><author>M_Alan_walker</author><pubDate>Wed, 19 Aug 2020 16:44:44 +0800</pubDate><description><![CDATA[　　由于项目需要，基于socket写了一个服务器与客户端的程序，越写越体会到tcp协议的厉害之处，因此特地学习了一下，做下笔记

　　TCP俗称传输控制协议，它是为应用层提供服务的，尽管TCP和UDP都使用相同的网络层(ip)，TCP却向应用层提供与UDP完全不同的服务，TCP提供一种面向连接的,可靠的字节流而服务

　　面向连接意味着两个都使用tcp的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接．这一过程与打电话很相似，显示拨号振铃，等待对方接通说"喂"，然后才说明是谁，以]]></description><category></category></item><item><title><![CDATA[c++利用模板实现二叉树插入删除以及遍历]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/107662856</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/107662856</guid><author>M_Alan_walker</author><pubDate>Wed, 29 Jul 2020 14:25:58 +0800</pubDate><description><![CDATA[#include &lt;iostream&gt;

using namespace std;

template &lt;typename Type&gt;
class BinaryTree;

template &lt;typename valType&gt;
class BTnode{
    friend class BinaryTree&lt;valType&gt;;
public:
    BTnode(const valType &amp;val);
    void insert_valu.]]></description><category></category></item><item><title><![CDATA[string类型重载赋值运算符]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/106873465</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/106873465</guid><author>M_Alan_walker</author><pubDate>Sat, 20 Jun 2020 16:49:42 +0800</pubDate><description><![CDATA[经典解法


CMyString&amp; CMyString::operator = (const CMyString &amp;str){
    if(this == &amp;str)
        return *this;

    delete []m_pData;
    m_pData = NULL;
    m_pData = new char[strlen(str.m_pData+1)];
    strcpy(m_pData,str.m_pData);
    
    retur]]></description><category></category></item><item><title><![CDATA[打印一个char字符的八位]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/106358735</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/106358735</guid><author>M_Alan_walker</author><pubDate>Tue, 26 May 2020 16:20:18 +0800</pubDate><description><![CDATA[socket通信服务器需要给待发送的数据加个头，这样客户端只有确认了头才能开始解析包，项目中出了问题，就是加了一个char作为头，但是发送与接收这个char内容不符，想办法数据这个八位的char，看看是哪里出了问题


unsigned char a;
int r[8];

r[0] = a &amp; 0x01; // 最低道位专属
r[1] = ( a &amp; 0x02) &gt;&gt; 1;
r[2] = ( a &amp; 0x04) &gt;&gt; 2;
r[3] = ( a &amp; ]]></description><category></category></item><item><title><![CDATA[apollo事件通信机制]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/103999628</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/103999628</guid><author>M_Alan_walker</author><pubDate>Thu, 16 Jan 2020 14:46:59 +0800</pubDate><description><![CDATA[我目前用的是基于ros版本的apollo,在apollo内部有两种消息传输机制,一种是基于ros的回调函数的订阅&lt;详细介绍&gt;来实现各个模块之间的数据通信,还有一种就是事件的通信机制,主要用于感知模块内部的通信,这种通信是基于进程间的内存共享来实现消息的传递.下面我主要介绍第二种消息传递的方式:


	先看一下事件的实际应用
	
发布事件:


void AsyncFus...]]></description><category></category></item><item><title><![CDATA[QT制作视频播放器]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/100038793</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/100038793</guid><author>M_Alan_walker</author><pubDate>Fri, 23 Aug 2019 15:37:05 +0800</pubDate><description><![CDATA[应项目需要，我之前用ffmpeg合成的视频需要用一个界面播放，思来想去自学QT来做这个工作。

首先我系统是ubuton16.0.4，先安装QT工具，然后直接开发。建议新来的朋友先自学一下QT的LayOut布局设计，使用布局会让你的控件更整齐，而且放在布局里的控件在设计好之后还可以跟着窗口的伸缩而伸缩，十分好用。网上很多将界面布局都用的代码来生成控件，这对QT初学者很不友好，我推荐一篇文章教大家用...]]></description><category></category></item><item><title><![CDATA[gcc: internal compiler error: Killed (program cc1plus)]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/89446668</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/89446668</guid><author>M_Alan_walker</author><pubDate>Mon, 22 Apr 2019 10:34:10 +0800</pubDate><description><![CDATA[这两天在linux下编译apollo2.5的项目时不时会有这个错误


gcc: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See &lt;file:///usr/share/doc/gcc-4...]]></description><category></category></item><item><title><![CDATA[我的apollo学习之路]]></title><link>https://blog.youkuaiyun.com/M_Alan_walker/article/details/89360310</link><guid>https://blog.youkuaiyun.com/M_Alan_walker/article/details/89360310</guid><author>M_Alan_walker</author><pubDate>Wed, 17 Apr 2019 17:17:37 +0800</pubDate><description><![CDATA[持续跟新中

Bazel入门：编译C++项目
	apollo怎样添加一个新的共享数据类型
	Apollo的感知融合模块解析
	apollo planning模块源码分析
	感知的单目、双目测距原理
...]]></description><category></category></item></channel></rss>