语言语法
文章平均质量分 70
哈乐笑
北大信科11级本科生,15级硕士生
展开
-
git命令个人总结
本文是个基于个人习惯的git命令总结,不图全面。最近的git主要学习自https://learngitbranching.js.org/git reset这个是用来改变branch的指向的git rebasegit rebase 也是用来改变branch或者head指向的,不过其涉及到讲一个分支的commit完全并到另一个分支上面,如果rebase的两个分支有直接的前后继关系,那么相当于reset命令了git checkout这个除了用来切换分支,也是用来改变HEAD指向的git chec.原创 2020-05-18 23:30:19 · 282 阅读 · 0 评论 -
C++11中range-based for loops中&&与&的区别
不得不说外国的技术博客还是要比中国的好太多,之前一直迷茫与range-based for loops中究竟&&与&该怎么用的问题,看了一下国外的技术讨论,真是豁然开朗,而国内的技术博客,几乎就没有见这方面的东西。for(auto i : c)一般用for(auto i : c)就是一个正常的拷贝,如果是一个类的话,会调用复制构造函数。vectorint> c = {1, 3, 5原创 2017-02-25 14:39:44 · 4923 阅读 · 0 评论 -
C++11及C++14标准的智能指针
智能指针这个概念经常会碰见,而且面试的时候太经常会被问到了,特来总结一下。C++11的智能指针及其背景auto_ptr的坑点C++11之前的智能指针是auto_ptr,一开始它的出现是为了解决指针没有释放导致的内存泄漏。比如忘了释放或者在释放之前,程序throw出错误,导致没有释放。所以auto_ptr在这个对象声明周期结束之后,自动调用其析构函数释放掉内存。int t =原创 2017-03-18 23:55:20 · 14015 阅读 · 2 评论 -
谈C++中运算符重载及其不合理性
原本写这篇主要是想记录一下发现的一个冷知识:C++中运算符重载是作为类对象的成员函数,而C#中是作为类的静态成员函数。因为昨天睡觉的时候我突然想起来,C++中类里面的比较函数一般都要定义为static的,才能传到sort函数里,但是operator重载的运算符本身意义也非常符合属于类本身,而不是单个对象的这种意义,为什么就不是定义成static的呢?查了下发现C#中果然就是需要把类中的运算符重载定义原创 2017-03-09 18:37:08 · 1136 阅读 · 0 评论 -
C++中const和引用修饰变量和函数的总结
一、对于修饰变量的用法对于const和&的基础用法就不说了。下面说点之前有误区和容易错的地方const修饰变量的误区关于const类型,这里有一个我之前的误区,我以为const定义的时候只能用常量初始化,但是实际上是没有这个规定的。const定义的变量可以用各种const,非const对其进行初始化,甚至可以是函数的返回值之类的。const int a = 5; //在编译的时候进原创 2016-12-05 22:32:31 · 12196 阅读 · 0 评论 -
从矩阵乘法的不同计算方式来看局部性原理
今天碰到的关于矩阵乘法不同情况下运算速度的问题,隐约记得是因为缓存的问题,后来突然想起来CSAPP那本书上讲过这个东西的,就是通过矩阵乘法三重循环的不同顺序来讲的局部性原理的,所以翻过来又看了一下。两个矩阵A,B相乘得到C【为了方便起见,把它们都看成n*n的方阵】经典的做法就是用三重循环来实现,但是具体这三重循环如何进行排列,就非常的有讲究。 假设n是一个非常大的数,也就意味着如果跨行的话,必然原创 2017-03-28 20:38:19 · 2781 阅读 · 1 评论 -
C++从虚函数表的底层来看虚函数调用问题
原本以为自己对虚函数掌握的还可以,结果前几天面试的时候被问了一个构造和析构函数里调用虚函数的问题,结果就给答错了。原创 2017-03-23 13:43:54 · 1461 阅读 · 1 评论 -
堆,赢者树,败者树的区别与联系
今天做LeetCode的23. Merge k Sorted Lists这道题的时候,遇到的这个问题。这道题本质上就是一个多路归并的问题,而这道题主要就是考察多路归并时候的选择问题。按照之前本科上课学的,最好的办法就是用竞赛树(败者树),可是我嫌麻烦就用堆来做了,也顺利能过。所以就想到,堆,赢者树,败者树到底有什么区别呢? 于是找了一些资料看了一下,在这里总结一下 首先它们三个的相同点就是在于原创 2016-12-06 16:13:50 · 10810 阅读 · 9 评论 -
pandas的SettingWithCopyWarning警告出现的原因和如何避免
这段时间一直在用pandas,今天运行前人代码发现报了一个warning: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org...原创 2018-07-31 01:17:28 · 209533 阅读 · 9 评论 -
Python使用try...except...输出详细错误
当Python的语段用了try...except...方式之后,就一直不太知道怎么定位到详细的程序crush位置,这两天程序需要用到这方面,于是就查了一下。需要使用traceback包import tracebacktry: #以除0错误为例 3/0except Exception, e: #这个是输出错误类别的,如果捕捉的是通用错误,其实这个看不出来什么 prin...原创 2018-11-26 13:45:02 · 43526 阅读 · 2 评论 -
C++11标准之后的移动构造函数和复制构造函数探究
如下一个类的定义,其定义了类的复制构造函数,和移动构造函数class B{public: B() :data(0) //默认构造函数 { cout << "Default constructor is called." << endl; } B(int i) :data(i) //带参数的构造函数 { cou原创 2016-12-05 15:08:31 · 5407 阅读 · 1 评论 -
谈vector<bool>的特殊性——为什么它不是STL容器
起因是这样的,昨天在查C++11的range base for loop相关的东西的时候原创 2017-02-24 13:58:42 · 7019 阅读 · 0 评论 -
C++动态转换类型static_cast,dynamic_cast,reinterpret_cast和const_cast探究
RT,过段时间来填坑原创 2016-12-08 00:57:37 · 314 阅读 · 0 评论 -
C++关键字总结explict/auto/decltype/typedef等
explict用法:定义在构造函数中,不允许隐式的类型转换。auto/decltypedeftype原创 2016-12-07 19:37:51 · 446 阅读 · 0 评论 -
C++ 中复合类型声明的理解(尤其是指针数组/数组指针/多维数组的问题)
这几天看《C++ Primer》第五版感觉还是颇有收获的,澄清了之前很多不是很理解的概念,也知道了好多新用法 首先,先澄清一个误解,就是数组的定义问题,在C中C99标准之后数组定义时,数组的大小/维度是可以是非const的变量,而C++中,仍然只能用常量来定义数组大小。而一般编译器在做这些工作的时候都会忽略C++中只能用常量来定义数组的这个问题。导致我以为C++也有这个标准了呢。原创 2016-12-05 18:23:14 · 1493 阅读 · 0 评论 -
不要再直接用字符串常量给字符串指针初始化/赋值了
起因是我看别人代码发现了那么一段程序,就是诸如char *p ="abcde";这样的我之前是从来没这样初始化过的,所以还以为get到了新方法,后来一想不对。。。”abcde”应在常量储存区,这个区的地址居然也能直接赋值?于是做了 如下探究首先先看,p是否真的在常量储存区 char *p = "Hello"; char *q = "Hello"; cout << (void原创 2016-12-08 16:16:15 · 4188 阅读 · 0 评论 -
C++/C中常见小问题总结
sizeof问题函数参数传递数组的退化问题注意sizeof是一个运算符,而不是一个函数。所以一般情况下数组传递给函数,都是要退化成指针的。所以下面这个void fun(char str_arg[100]){ printf("%d\n", sizeof(str_arg));}输出4(32位)或者8(64位);作为函数参数传递,以下写法均等价:fun(char [8])fun(char [原创 2016-12-07 16:45:35 · 455 阅读 · 0 评论 -
C++11中枚举enum和union,顺带说一下内存对齐和大小端问题
这两个不太常用的小知识点,今天碰到了,所以特来总结一下。union类union X{ int a; struct { short b; short c; };};int main(){ X x; x.a = 0x20150810; printf("%x,%x\n", x.b, x.c); retur原创 2016-12-07 19:45:52 · 1981 阅读 · 0 评论 -
C中的位域与sizeof
位域这个实在是太罕见了,今天第一次才碰见,居然不认识,只好查了一下,发现居然是个古老的C里面的东西,估计是当年为了节约空间搞出来的奇奇怪怪的东西。定义struct s1{ int i: 8; int j: 4; int a: 3;}a;a.i = 5;a.j = 14;这样i就只有8位(8 bits),j有4位,a有3位然后位域有一个奇怪的sizeof问题,其储存原创 2016-12-08 22:02:51 · 1188 阅读 · 0 评论 -
编程语言中,整型的一个小细节0和0x
今天碰到一道题int main(){ int m=0123, n = 123; printf("%o %o\n", m, n); //%o表示输出8进制无符号整型 return 0;}我以为m也是表示123呢,0(注意这个地方是0)加在前面是没用的,结果万万没想到0加在前面表示8进制,就跟0x加在前面表示16进制一样。而输出的时候都不会出前面的前导0和前导0x 注意一下这个小细节原创 2016-12-09 13:17:10 · 900 阅读 · 0 评论 -
C++11的右值引用(一)——左值(lvalue),纯右值(prvalue)和将亡值(xvalue)
基本概念C++11之前只有左值和右值的概念:lvalue,rvalue。左值可以取地址,右值不能取地址。 但是C++11之后又划分的更加详细了,分为左值(lvalue),纯右值(prvalue)还有将亡值(xvalue),关系如下: 之前是lvalue的地方还是lvalue,之前是rvalue的地方变成了prvalue,而xvalue则是:把右值引用类型作为返回的函数或者重载操作符。例原创 2017-02-28 00:53:18 · 1955 阅读 · 0 评论 -
C++中仿函数/函数对象,函数指针的用法
研究这个起因是这样的,就是今天在用priority_queue的时候,需要自定义比较函数,但是此时又不能修改需要比较的类的内容(即不能用重载<的方法),所以只能写在外面,但是发现这样并不能编译通过。报的错叫cmp(我写的那个比较函数)不是类型名。后来查了下资料发现,这个需要用比较类去完成,比较类需要重载()方法,所以这个事情就非常引起我的好奇,想要知道一下,为什么sort这样的函数就可以直接用函数名原创 2016-12-06 21:44:07 · 2850 阅读 · 0 评论