自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Coding_QK

Learning By Doing .

  • 博客(34)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 浅谈Redis中的Rehash机制

已经很久没写过纯C的代码了,最近在学习redis,惊叹于它的强大优雅,同时也在闲暇之余翻看它的源码,结构非常清晰,各个模块的功能也十分明确,非常适合阅读与学习。众所周知,redis支持多种数据结构,其中dict是使用频率相当高,也是非常实用的一种。在redis的具体实现中,使用了一种叫做渐进式哈希(rehashing)的机制来提高dict的缩放效率。 其实关于渐进式哈希的相关文章...

2018-05-23 10:45:29 28904 2

原创 2018 春招总结 & 面经分享 (阿里/腾讯/网易/今日头条/微软)

2018 春招总结 & 面经分享 (阿里/腾讯/网易/今日头条/微软) 本文篇幅较长,排版较烂,非战斗人员请尽快撤离。总算是可以对2018-春招-暑期实习专场来一个完美收官了。最终有幸收到了今日头条(后端研发),网易杭州研究院(C++开发)和腾讯(IEG 后台开发)的offer,当然还是选择投入向往已久的鹅厂的怀抱啦。从三月初开始陆续投出简历,到收到一个接一个的提前批面试...

2018-05-11 16:01:42 8131 1

原创 [C++] 不要在构造函数里调用std::shared_from_this()

前段时间在用std::shared_ptr/std::weak_ptr实现thread-safe和memory-safe的观察者模式(Observer Pattern)的时候,调试总给我报错,最后排查了很久,发现是一个非常tricky的小错误。最开始的版本大概是这样子的:class Observer;class Subject {public: void regi...

2018-05-05 11:56:41 2254

原创 <C++> 基于C++11/14/17的线程池实现

线程池,顾名思义就是预先启动一些线程,集中管理,需要的时候直接拿来用,无需用时再创建。尤其是在Windows平台,线程是稀缺资源,线程的创建和销毁都是十分耗时的,所以利用线程池来提升并发场景下的性能,是十分有必要的。C++11首次对并发进行了支持,这使得我们利用STL编写多线程应用程序成为了可能,不过STL的thread比较简陋,并没有提供更多的强大特性,只是一个最基础的多线程解决方案,定位应该是

2017-11-23 11:11:35 4075

原创 <Python> 递归展开嵌套列表等可迭代对象(list,dict,set...)

展开嵌套列表算法是一个常考点,既是基础,但是要写好也不简单,我见过很多个版本,老手和新手之间的差别简直堪比云泥。接下来分享一个高效又巧妙的版本,代码也很短。今天在知乎同样看到了一下这段代码,是之前flatten的lambda版本,可以说是把pythonic思想进一步升华了,实在是太优美啦。flatten = lambda nested: list(filter(lambda _...

2017-10-23 17:04:45 2061

原创 <C++>shared_ptrs利用std::enable_shared_from_this()实现安全管理this指针

智能指针大法好,但是坑儿免不了,不要哭来不要闹,C艹面前谁敢diao利用RAII来管理资源自然是高效,但是对于一些比较特殊的类型,还是会有不得不注意的地方,没错说的就是std::shared_ptr和this指针的搭配。 shared_ptr的内部实现包括一个指向目标对象的raw pointer和一个包含reference count等其他维护sp状态的数据结构,称之为控制块(control b

2017-10-15 10:16:12 575

原创 利用优先级队列(priority_queue)优化单源最短路径算法

单源最短路径,不用说一定是经典的dijkstra算法了。dijkstra的原始版本做到了很好的解决问题,但是还有进一步优化的空间。接下来展示通过“优先级队列(priority_queue)”优化时间复杂度的方法。 首先把图的类定义出来,我采用的是“class Edge”+”class Graph”的定义方案,将有向边和图的实现抽离,如有不妥,方请指正:template<typename Type

2017-10-14 11:12:13 962

原创 <Effective Modern C++>Item 18: Use std::unique_ptr for exclusive-ownership resource management.

When you reach for a smart pointer, std::unique_ptr should generally be the one closest at hand. It’s reasonable to assume that, by default, std::unique_ptrs are the same size as raw pointers, and f

2017-09-27 18:03:31 338

原创 <Qt> 应用单例模式时重复delete pointer导致_CrtIsValidHeapPointer(block)错误

前景:在写Qt桌面应用时,有一个场景是TabWidget管理四个子窗口,每个子窗口都只能有一个实例方便窗口的切换,自然而然就想到要用singleton-pattern,但是我应用时能正常启动,但是关闭main window的时候每次都弹出_CrtIsValidHeapPointer(block) …既然是关闭窗口的时候弹出的错误,那么肯定是main window析构的时候发生了错误,根据错误信息也

2017-09-24 23:23:57 1903

原创 <Effective Modern C++>Item 15: Use constexpr whenever possible.[constexpr 表达式]

学习+使用C++已经有挺长一段时间了,时间越长越是感叹C++语法之多之深,所以那些简历上会写精通C++的人权当是不懂事了。 constexpr是C++11新加入的一个关键字,我一直对它的用法有些困惑,所以平时写项目的时候从来不敢乱加这个关键字,在这一个Item的开头,作者也写着: If there were an award for the most confusing

2017-09-09 17:11:09 254

原创 <Qt> 在connect中使用lambda实现高效的信号/槽关联

2017-09-07 21:39:27 15387 9

原创 <Qt> QWidget派生类setStyleSheet方法无效问题

最近在做一个基于Qt的桌面应用,准备总结一下开发过程中遇到的一些问题。我需要创建一个继承自QWidget的类来设计自己的窗口,使用StyleSheet无疑能方便快捷地配置窗口的一些风格,但是我在应用继承自基类的setStyleSheet的方法时发现,设置的style sheet并不能在最终的页面上生效,查阅了官方文档之后发现只需要在派生类中重写一下paintEvent方法。 具体如下: 官方文

2017-09-06 23:02:26 4527 1

原创 <Python> Numpy中的矩阵乘法问题

最近参加的一个Program,主题是生物识别,其中的PCA/LDA特征值提取部分需要大量用到线性代数矩阵论的知识,但是稍不注意numpy中的乘法规则就很容易得到错误的结果,最终导致后续结果的崩盘,尤其是较大规模的矩阵,更是很难发现错误。Numpy中的矩阵乘法分为两大情况,使用numpy.array和使用numpy.matrix. Numpy确实重载了*操作符,可以直接对array或者matrix对

2017-07-27 22:48:54 40152 4

原创 [C++] 类的"实现"与"接口"分离

C++这门语言囊括了多种语言范式,并不是严格的OOP语言,所以在“实现与接口的分离”这一方面做得并不算好。 这里简述C++的类设计中把实现与接口分离的方法.在C++的某个class的定义中,不仅声明了接口,还可以看到实现的具体细节,当然这个视角是针对类内部的,通常是在私有域private中,比如下面这个类:class Person {public:Person(const std::

2017-06-25 17:58:55 3952

转载 <Effective C++> Item 29:争取异常安全的代码

异常安全(Exception safety)有点像怀孕(pregnancy)……但是,请把这个想法先控制一会儿。我们还不能真正地议论生育(reproduction),直到我们排除万难渡过求爱时期 (courtship)。(此段作者使用的 3 个词均有双关含义,pregnancy 也可理解为富有意义,reproduction 也可理解为再现,再生,courtship 也可理解为争取,谋求。为了与后面

2017-06-20 23:38:36 317

转载 <Effective C++>:Item25:考虑写出一个不抛出异常的swap函数

本文转载,原文见:原博 ①如果 std::swap 对于你的类型来说是低效的,请提供一个 swap 成员函数,并确保你的 swap 不会抛出异常。 ②如果你提供一个成员 swap,请同时提供一个调用成员swap的非成员swap。对于类(非模板),还要特化 std::swap。 ③调用swap时,请为std::swap使用一个using声明式,然后在调用 swap时不使用任何na

2017-06-20 12:16:01 294

原创 <Python爬虫>爬取豆瓣图书/豆瓣电影系列

DouBanCrawls代码托管在Github -> DouBanCrawls 完成了豆瓣图书/豆瓣电影的爬取,按评分从高到底排序存到了本地的excel,可以在Results文件夹直接查看,后续打算丰富内容,提高爬虫性能和规模,或者加上GUI界面。基于 Python 3.6.1,主要使用了requests,beautifulsoup,openpyxl和urllib.实现功能:按标签名称进行相

2017-06-19 10:11:31 1199

原创 网易2017春招实习生笔试编程题集合(C++方向)

挺早之前做好一直想写一篇博客分享一下,但是后来给忘了…C++方向一共十二道编程题,可能和别的方向有一些出入。题目总体的难度不大,有些题有些小坑,适合进阶者练练手。代码都扔在Github了 -> Code 题目列表:分饼干双核处理堆砖块奇怪的表达式求值小易记单词工作安排凃棋盘消除重复元素调整队列赶去公司集合魔力手环[Problem 1]

2017-06-17 10:35:51 2765

原创 <Effective C++>:Item 20:以pass-by-reference-to-const替代pass-by-value .

aa

2017-06-07 22:58:54 406

原创 <Effective C++> (Item 13-15): 以对象管理资源

在以前的C++用法中,new是非常常见的用来动态分配内存的方式,但是有new必须有delete,将内存还给系统,否则就会造成内存泄露,这是很危险的一件事情,而以对象管理资源这一思想就能比较好的解决这一问题通常情况下,对于一个对象,如果是built-in类型,我们就直接new了,如果是自定义类型,一般使用工厂函数返回其指针,生成对象之后肯定需要释放对象吧,对于内置类型,就是成对的使用delet

2017-06-02 22:59:16 346

原创 <Effective C++> Item 9:绝不在构造和析构过程中调用虚函数

这个应该是C++面试的经典题了,所以值得拿出来说一说比如在一个继承体系中,基类的构造函数中调用了一个基类的成员函数,你把它声明为virtual,至少你在设计的时候是认为它有virtual属性的。class Base{public: Base(); virtual void someFunction()=0; ... }Base::Base(){ ...

2017-05-30 16:31:53 398

原创 <Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数

引言:觉得这一Item挺重要的所以特地拿出来说一说。之前在知乎看到过陈硕大大的某回答中有这么一句话让我印象深刻,大致是“想知道一个项目靠不靠谱(编码者基础扎不扎实),只要点开一个文件看看自己设计的类,有没有禁用或者正确实现constructor,copy assignment,copy constructor”,可见这一细节在具体工程实践中的重要性。如果你设计的类,每一个实例都有其独立性,比如书中

2017-05-27 15:50:11 339

原创 <Pycharm>快捷键总结 .

> 之前也零散的看过一些Python,因为这个暑假项目的缘故,这几天开始全面系统的学习Python,IDE当然是选择JB家的Pycharm啦,用的顺手真的爽的一比,快捷键用的溜,真的能极大地提高效率,现在对Pycharm的一些快捷键做一个小总结.JB家的IDE很多快捷键都是通用的,所以借鉴了Intellij的一些快捷键用法 <其实算是一篇转载啦…>ctrl+alt+L,格式化代码,曾经用Eclip

2017-05-19 11:09:31 4739 1

转载 <Effective Mordern C++>笔记:Item 9:prefer alias declarations to typedefs.

转载自原博:原博C++11中引入的std::unique_ptr智能指针是个好用的东西,在我们使用unique_ptr的时候往往会写出这样的类型std::uniqeu_ptr<std::unordered_map<std::string,std::string>>,看上去很臃肿,因此大多数的时候我们会选择使用typedef进行类型的重定义,简化类型名称。可是在C++11中引入了一个using别名的

2017-05-11 19:43:34 361

原创 <Effective Mordern C++>笔记:Item 8:prefer nullptr to 0 and NULL.

虽然如果C++看到一个指针类型被定义为0,它会把0解析为一个空指针,但是0终究只是个int类型并不是个指针。 NULL也是一样的,它也被允许解析为非int型的整形,但不是一个指针类型。 在一些接受不同参数类型的重载函数中,如下:void f(int); void f(bool);void f(void*);f(0); // 调用f(int), 而不是f(void*)f(NULL)

2017-05-11 19:32:58 333

原创 <Effective Mordern C++>笔记:Item 7:Distinguish () and {} when creating objs.

从C++11开始,初始化有三种方式:括号,=赋值和列表(也可=后接列表)。先看如下例子开个头://Widget是个自定义类Widget w1; // 调用默认构造函数Widget w2 = w1; // 创建w2时调用`=`,不是赋值操作,调用了复制构造函数w1 = w2; // 赋值操作,调用重载的赋值运算符为了解决多种初始化方式引起的困扰,C++11引入了列表初始化。 例如对于一个vec

2017-05-08 19:39:56 340

转载 <Effective Mordern C++>Item 6:UseTheExplicitlyTypedInitializerIdiomWhenAutoDeducesUndesiredTypes

啊…别人总结的精简干练,那么…再怒转一篇??? 原博在Item5中提到了使用auto所带来的诸多优点,在Item2中提到了auto的类型推导规则和模板类型推导基本一致,推导出来的类型有的时候并不是我们所想要的类型(会忽略CV限制符和引用),那么本文继续探究auto的其它缺点。std::vector<bool> features();auto ret = features();上面的ret是

2017-05-06 16:06:25 307

原创 <Effective Mordern C++>笔记:Item 5:Prefer auto to explicit type declarations.

很多时候我们定义一个变量,都是直接的int x;根据编译器的不同,没有初始化的变量往往会有不同的未定义结果,进而产生各种各样的问题,在《Effective C++》中也有建议要养成初始化变量的习惯,使用auto可以省去判断各种变量类型的麻烦,但是auto是根据初始化值来判断的,所以变量必须初始化。除此之外,很多时候为了声明一个变量的类型,往往需要很长很啰嗦的前缀,比如在一个模板中,声明一个迭代器指向

2017-05-06 15:56:49 406

转载 <Effective Mordern C++>笔记:Item 4:Knowing how to view deduced types .

本篇为转载,转自原博在Item3中学习了C++11新特性decltype,decltype可以获取变量或者表达式的类型,但是获取到的类型只能用于定义其他的变量和类型,不能打印出来,也不能用来操作。毕竟是编译期实现,用来做类型反射就算了,那么至少也应该可以打印输出下吧,毕竟书中得来终觉醒。那么本文就介绍几种方法来得到decltype的返回类型的名字。IDE Editors 最简单的就是依靠C+

2017-05-03 20:24:41 295

原创 <Effective Mordern C++>笔记:Item 3:Understand decltype .

这个decltype相对于前面的template和auto就更高级一点了,它不仅可以推断出一个变量的类型,还能推断出一个表达式的类型。像这样:const int i=0;//decltype is const intbool f(const CLASS& w);//decltype is bool(const CLASS&)if(f(w))//decltype is boolvector<t

2017-05-03 20:03:08 341

原创 <Effective Mordern C++>笔记:Item 2:Understand auto type deduction.

首先声明,在大部分情况下,auto的类型推断和Item 1中Template的推断是一致的,所以重复部分不再赘述,可以参考上一篇。变量声明为auto,auto在此处就是扮演template中T的角色。auto也遵守template的三种情况分类,详情看上一篇。在C++11中,变量的声明有四种方式int x=27;int x(27);int x={27};int x{27};//四种方式的

2017-05-03 19:14:27 550

原创 <Effective Mordern C++>笔记:Item 1: Understand the template type deduction.

写在前面: 基础的东西学完之后,最好的进阶方式就是项目+啃书了,项目也在准备当中,啃书还是绝对不能落下的。现在C++11/14已经成为主流,正好在图书馆借到了《Effective Mordern C++》,以读书笔记的形式做一个记录。而且这本书还没有中文版,所以也能当做是提高自己英文阅读能力的有效手段。Item 1: Understand the template type deduction

2017-05-02 22:54:03 360

原创 [Hello My Blog]基于腾讯云的WordPress个人技术博客搭建

下午花了两个多小时的时间搭建了自己的第一个博客,本来想直接转载一份别人的教程作为第一篇文章试试水,但是自己的在搭建的过程中也遇到了一些问题,所以决定自己写一篇做一个简单的分享顺便避免小白白再踩坑吧。博客基于腾讯云+64位CentOS 7.2+PHP7+MySQL+WordPress,是一套纯开源的博客系统。技术博客这种东西,于个人,可以梳理自己的知识点,记录自己的学习曲线,巩固自己的理论基础,不断回

2017-05-02 18:24:59 2840 2

转载 【转】<C++ Primer 5th>Template模板笔记

1.模板实例化:C++中的模板是一个函数或者类的蓝图,编写了不局限于类型的通用代码。模板定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进行编译,这一过程被称为模板实例化。用户提供不同的类型参数,就会实例化出不同的代码。 2.函数模板:编译器可以根据用户使用函数模板时提供的实参,推断出函数模板的类型参数,这被称为模板实参推断。template<typename T>

2017-04-14 10:37:10 456

HeadFirst设计模式英文版

《Head First 设计模式》的英文版本,文风很幽默,很适合初学者阅读

2018-01-04

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除