<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Quellaaa的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Quellaaa</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Quellaaa]]></copyright><item><title><![CDATA[不用加减乘除实现加法]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/112991859</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/112991859</guid><author>Quellaaa</author><pubDate>Fri, 22 Jan 2021 17:20:32 +0800</pubDate><description><![CDATA[不用加减乘除实现加法
其实看到这玩意，第一反应就是计算机原理东西，就是二进制运算
然后就从二进制角度讨论这玩意吧~
学过小学加法都晓得，加法是从个位加法开始，然后进阶十位加法，解这玩意的思路也可以这样：
以2+3为例，转为二进制为10+11
不考虑进位的结果
先枚举下所有情况，再总结规律：
0+1=1
0+0=0
1+0=1
1+1=0（由于不考虑进位，所以就只看最低位的值）
从上面结果看，发现一个规律相同的值结果为0，不同的值结果为1，这就是异或运算符呀~
所以不考虑进位结果用异或计算。
只考虑进位结果
]]></description><category></category></item><item><title><![CDATA[c++的stl erase函数使用]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/112875079</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/112875079</guid><author>Quellaaa</author><pubDate>Wed, 20 Jan 2021 15:08:49 +0800</pubDate><description><![CDATA[erase功能
erase()函数的功能是用来删除容器中的元素
删除某个容器里的某个元素：c.erase(T);
看似一个简单的动作，然而对不同类型的容器，内部却做了截然不同的事情，后面介绍。
例子
假设有这样一个题目，将某个容器中所有满足条件N == X的元素删除，按照常规的思路应该有类似这样的代码：
// 假设Container和container分别表示一种容器和对应的一个对象
Container::iterator it;
for (it = container.begin(); it != con]]></description><category></category></item><item><title><![CDATA[多重继承下父子类之间的类型转换]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/112199877</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/112199877</guid><author>Quellaaa</author><pubDate>Mon, 04 Jan 2021 20:22:11 +0800</pubDate><description><![CDATA[文章目录一、前言二、情景模拟复现三、开始分析1. 情况12. 情况23. 情况34. 情况4四、运行结果五、总结
一、前言
在日常工作中踩了一个坑，现象是：从一个dll里获取导出类A，然后调用类A的FunA，结果FunA没有被调用，相关代码简化如下：
class AImpl : public OtherClass, public A
{
	// OhterClass 不包含类A的FunA
    ...
    // 用户通过该函数获取A的指针，结果用A的指针调用FunA失败
    void Query(]]></description><category></category></item><item><title><![CDATA[平衡树]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/112187670</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/112187670</guid><author>Quellaaa</author><pubDate>Mon, 04 Jan 2021 17:08:59 +0800</pubDate><description><![CDATA[文章目录零、题目一、理解题目二、解析思路三、解题过程方法1.  计算左右子树的深度方法2. 利用后序遍历计算左右子树的深度
零、题目
输入一棵二叉树的根结点，判断该树是不是平衡二叉树。
如果某二叉树中任意结点的左右子树的深度相差不超过1，那么它就是一棵平衡二叉树。
一、理解题目
遇到题目时不要慌张，冷静审题，找到目的，理解正确再做题，不要靠臆想做题
预期：判断一个二叉树是否为平衡二叉树
how：怎样判断呢？其实题目已经给我们提示了，任意节点的左右子树的深度相差不超过1
关键字：树的深度
二、解析思路
这个题]]></description><category></category></item><item><title><![CDATA[利用VAssistX插件快速给类的全部声明函数生成定义]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/109160691</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/109160691</guid><author>Quellaaa</author><pubDate>Mon, 19 Oct 2020 14:51:10 +0800</pubDate><description><![CDATA[不知道各位大佬在日常开发时有没有遇到过这样一个问题：类的函数声明过多，即使每个声明可以通过VAssistX插件快速生成定义，如图：右键选中某个方法，在右键弹出菜单栏中选择该项即可生成该函数的定义

但是当一个类有20多个声明（有可能更多）后，一个个这么弄，也挺费时的，偶然一个机会发现，竟然可以通过右键选中类名，在右键弹出框里点击该项，就可以生成该类的所有声明，太牛逼了！！！！


...]]></description><category></category></item><item><title><![CDATA[《c++高级编程》第一章]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/108476995</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/108476995</guid><author>Quellaaa</author><pubDate>Tue, 08 Sep 2020 20:57:20 +0800</pubDate><description><![CDATA[今天看了《c++高级编程》第一章，本章主要内容就是介绍c++一些基本语法，最后以一个“员工记录系统”引用收尾，本篇文章就是想说说“员工记录系统”。

学会分解需求

当我看到这个名字，“员工记录系统”，获知其几个需求：新增员工、解雇员工、提高工资、展示全部在职员工和非在职员工，立马就想着如何实现了。

这个思考方式太过激进了，需要改进。

当我们看到任何一个需求，尽管再简单，也要对其进行分解：1）员工新增和减少 2）工资提高 3）全部员工信息需要展示，所以需要保存

由此可见，员工是个对象，存储系统也是个对]]></description><category></category></item><item><title><![CDATA[关于stl中关联容器的一些基础东西]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/108279891</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/108279891</guid><author>Quellaaa</author><pubDate>Fri, 28 Aug 2020 15:58:54 +0800</pubDate><description><![CDATA[题外话

最近发现自己日常工作中虽然用c++编码，但是没咋用stl的东西，所以就开始补充这方面的知识

正题

1. 声明set容器装的数据类型时可以顺便定义比较函数方法。如：

普通的声明set容器装类型的方式：set&lt;int&gt; ss

声明set容器时还定义比较方法（PS：写比较函数时注意相等比较要返回false）：


// 要写成结构体对象方式，而不是函数方式，因为set模板的参数是类型，而不是地址或函数
struct compare
{
    bool operator()(cons]]></description><category></category></item><item><title><![CDATA[针对vector或string的shrink-to-fit的swap技巧]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/108243550</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/108243550</guid><author>Quellaaa</author><pubDate>Wed, 26 Aug 2020 17:14:56 +0800</pubDate><description><![CDATA[前言

有时可能会遇到这样一种情况：声明一个vector变量为vec，前期会有很多元素存储到vec中，导致vec的capacity变大；后期因为一些原因要对vec的元素进行筛选，删除了vec里一些元素，但是没有改变vec的capacity，这会使vec占用很大内存，即size小于capacity。

解决思路


vector&lt;container&gt; vec;
vec.push_back(a);
...
// 做了元素增加和筛选后，这时vec的size远远小于capacity
...
vector]]></description><category></category></item><item><title><![CDATA[#代码优化之匹配相关]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/108198770</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/108198770</guid><author>Quellaaa</author><pubDate>Mon, 24 Aug 2020 14:31:28 +0800</pubDate><description><![CDATA[1、原代码：
if( strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comparenocase()||
	strkey.comp]]></description><category></category></item><item><title><![CDATA[记一次字符乱码bug解决过程]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/107798097</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/107798097</guid><author>Quellaaa</author><pubDate>Tue, 04 Aug 2020 21:01:37 +0800</pubDate><description><![CDATA[前言

最近被分配了一个bug：解决上报数据中文乱码问题。d⊂(ο･㉨･ο)⊃又是字符乱码问题。

大概背景是：该数据是在produce.dll中通过assemble.dll组装，调用upload.dll上传的

如何在多个模块中定位是哪个环节出的问题，这是比较恶心和比较棘手的问题~

解决过程

一、首先解决如何在多个模块中定位哪个环节出的问题

1）通过日志定位问题。本来是想通过看日志定位问题的，但是日志显示的没有乱码，然而抓的包以utf-8显示时，发现就乱码了，所以通过日志定位不可行。

2）通过调试]]></description><category></category></item><item><title><![CDATA[windows 修改桌面快捷方式的名字]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/107089932</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/107089932</guid><author>Quellaaa</author><pubDate>Thu, 02 Jul 2020 17:54:00 +0800</pubDate><description><![CDATA[直接贴代码~


#include &lt;shellapi.h&gt;
#include &lt;shlobj.h&gt;
#pragma  comment(lib, "shell32.lib")
bool _ChangeLinkFile(CString strOrignPath, CString strAferPath)
{
	HRESULT hr = CoInitialize(NULL);
	if (SUCCEEDED(hr))
	{
		IShellLink *pShellLink = NULL;.]]></description><category></category></item><item><title><![CDATA[踩过的坑—CString的format方法报错Incorrect format specifier]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/107046301</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/107046301</guid><author>Quellaaa</author><pubDate>Tue, 30 Jun 2020 17:24:15 +0800</pubDate><description><![CDATA[前言

在CString上踩过很多坑，避免以后踩过相同的坑，就把该坑记录~
背景：在转换环境变量函数里输出日志多次调用了format方法，导致程序崩溃。

例子

类似这样调用：


CString strPath;
// ....
//strPath 从配置文件中读入，格式如：%installPath%/test.dat
OutputLog(L"path is %s", strPath);

然后程序出现这样的错误：



解决过程

这个现象是多个线程到同个函数里输出该条日志触发的，当时以为是多线程导致]]></description><category></category></item><item><title><![CDATA[#mark资源# chrome增加扩展程序]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/106274670</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/106274670</guid><author>Quellaaa</author><pubDate>Fri, 22 May 2020 10:33:17 +0800</pubDate><description><![CDATA[前言

最近遇到一个问题，chrome不能通过拖拉方式增加扩展程序，即使是官方网站下载的crx也不行

解决

通过搜索发现可能是因为下载的扩展程序兼容性不够好，所以导致该版本的chrome不能增加扩展程序，即只要下载一个兼容性好的扩展程序，就可以在chrome里面通过拖拉方式增加扩展程序。

从哪下载

https://pictureknow.com/extensions

从上面网址上下载的扩展程序可以以拖拉方式加载到chrome中
...]]></description><category></category></item><item><title><![CDATA[实现最小栈]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105976821</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105976821</guid><author>Quellaaa</author><pubDate>Thu, 07 May 2020 17:16:10 +0800</pubDate><description><![CDATA[题目

实现一个这样的栈，这个栈除了可以进行普通的push、pop操作以外，还可以进行getMin的操作，getMin方法被调用后，会返回当前栈的最小值。栈里面存放的都是 int 整数，并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)，空间复杂度也能O(1)的话可加分。

代码


class MinStack
{
public:
	MinStack(){...]]></description><category></category></item><item><title><![CDATA[记录前几天踩过的一个关于重定向的巨坑]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105711714</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105711714</guid><author>Quellaaa</author><pubDate>Thu, 23 Apr 2020 17:22:49 +0800</pubDate><description><![CDATA[前言

前几天发现一个神奇的bug，程序加载dll时提示失败，但是在win7 x64的1760环境可以成功，但是在win7 x64的1761环境加载失败。

解决思路

PS：我就不把我走的n多弯路写出来了。。。。。太坑了

1、通过windbg远程调试或者vs远程调试定位到加载dll失败，定义该dll名字为error.dll，但是写了个test测试是否可以成功加载该dll，成功了。

此时觉得有...]]></description><category></category></item><item><title><![CDATA[C/C++代码跨平台编译注意问题]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105537040</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105537040</guid><author>Quellaaa</author><pubDate>Wed, 15 Apr 2020 15:52:14 +0800</pubDate><description><![CDATA[平台包括: windows7(32bit and 64bit), windows 8.1(32bit and 64bit, desktop, app store, metro ),windows phone, Mac(32bit and 64bit), iOS(32bit and 64bit, x86, x64, armv6,armv7-a, arm64), Linux(32bit an...]]></description><category></category></item><item><title><![CDATA[c++ 跨平台开发]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105512953</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105512953</guid><author>Quellaaa</author><pubDate>Wed, 15 Apr 2020 15:41:51 +0800</pubDate><description><![CDATA[前言

要达到c++跨平台开发目的，我打算从为什么C++不能跨平台开发和如何实现跨平台开发这两个方面入手

为什么C++不能跨平台开发

C++不能跨平台，不是指源程序不能跨平台，而是可执行文件不能跨平台。

因为C++源程序要经过预处理、编译、汇编和链接过程才生成可执行文件，但由于这过程中会受到平台限制，如汇编语言有不同版本，和平台有关（CPU、操作系统和编译器等）；所以不能将windows平台...]]></description><category></category></item><item><title><![CDATA[三个调用约定的区别]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105493263</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105493263</guid><author>Quellaaa</author><pubDate>Mon, 13 Apr 2020 17:21:38 +0800</pubDate><description><![CDATA[调用约定
			参数传递方向
			谁清理栈
			使用场合
			修饰函数符号表格式
		__cdecl
			从右向左
			调用方
			C/C++、MFC的默认方式;
			可变参数的时候使用
			_函数名
		__stdcall
			从右向左
			被调用方退出函数时清理
			Win API
			_函数名@参数名
		__fastcall
			从右向左，
			但左边开始的两...]]></description><category></category></item><item><title><![CDATA[volatile和explicit含义]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105329311</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105329311</guid><author>Quellaaa</author><pubDate>Sun, 05 Apr 2020 16:56:45 +0800</pubDate><description><![CDATA[直译

首先看其中文意思，辅助理解记忆。


volatile：

adj. [化学] 挥发性的；不稳定的；爆炸性的；反复无常的

n. 挥发物；有翅的动物



explicit：

adj. 明确的；清楚的；直率的；详述的


在c++的含义

1）volatile：用于告诉编译器不要优化，在运行期再取其值。

程序在进行编译的时候, 编译器会进行一系列的优化.比如, 某个变量被修饰为 c...]]></description><category></category></item><item><title><![CDATA[运算符优先级]]></title><link>https://blog.youkuaiyun.com/Quellaaa/article/details/105147258</link><guid>https://blog.youkuaiyun.com/Quellaaa/article/details/105147258</guid><author>Quellaaa</author><pubDate>Fri, 27 Mar 2020 18:13:40 +0800</pubDate><description><![CDATA[前言

踩了几次关于运算符优先级的坑，所以就写这个文章mark一下~

正文


			优先级
			
			
			运算符
			
			
			名称或含义
			
			
			使用形式
			
			
			结合方向
			
			
			说明
			
		
			1
			
			
			[]
			
			
			数组下标
			
			
			数组名[常量表达式]
			
			
		...]]></description><category></category></item></channel></rss>