C++ 初始化 我们从这样一个问题引入 #include <iostream> int ans = 1 ? std::cout << "hello", 1 : 100; int main() { std::cout << ans; return 0; } 对C++有一定了解的同学可能会知道,这个程序的输出是hello1 因为在main函数之前,我们会有一个初始化的过程,在这个过程中,我们就会输出hello,然后在初始化结束后,我们进入main,就会输出1 这种运行时的表达式会让我…
C++ 初始化 我们从这样一个问题引入 #include <iostream> int ans = 1 ? std::cout << "hello", 1 : 100; int main() { std::cout << ans; return 0; } 对C++有一定了解的同学可能会知道,这个程序的输出是hello1 因为在main函数之前,我们会有一个初始化的过程,在这个过程中,我们就会输出hello,然后在初始化结束后,我们进入main,就会输出1 这种运行时的表达式会让我…
C++中的等价,相等与自定义比较 英文好的同学可以看这篇文章 链接 先看这样一段代码 std::vector< std::pair<int, std::string> > v1 = ... // v1 is filled with data std::vector< std::pair<int, std::string> > v2 = ... // v2 is filled with data std::vector< std::pair<int, std…
ARTS打卡 第一周 leetcode周赛题目 https://leetcode-cn.com/problems/maximum-subarray-min-product/ 赛场上没做出来,是一个单调栈,足以看出对单调栈理解还是不够透彻,要找时间进行一次针对性的练习 找到下一个比自己小的元素 while (!s.empty() && nums[s.top()] > nums[i]) { nxt[s.top()] = i; s.pop(); } s.push(i); 很简洁的一个模板,栈中元素比…
CSAPP总结 昨天,5月9号终于是赶着CMU的日程把csapp的东西结束了 其实书已经读完很久了,但是最后一个proxylab一直拖着没做 最后的8个lab都已经上传到我的github了 现在是最后的总结性的一篇文章,看着目录写一写,并不是说总结csapp中的知识点,而是谈谈读完书后的体会 我会针对每一章,以及每一个lab都说一下完成后的感受,以及学习时的要点,所以如果没读过这本书的同学也可以进行参阅 第一章是计算机系统漫游,就是一般性的给我们一个overview,并没有涉及到很多的细节,所以看的时候不必太在意技…
dfs剪枝技巧 这篇文章灵感来源于今天leetcode的每日一题 先看题 如果学过算法的同学应该知道,这道题是NP问题,是不存在多项式时间的解法的 最朴素的想法就是直接暴力搜索,对于每个任务来说,为他分配工人,那么复杂度就是m^n 这道题正确的做法是状压dp,以工人划分阶段,dp[i][j]表示i个工人,状态为j的最小值 转移就是dp[i][j] = min(dp[i - 1][k] + sum[j - k]) 其中k是j的子集,sum[j - k]就是这个差集的任务的总时间 但是还有一种做法是二分+dfs,因为对…
C语言标准IO中的坑 这节内容来自《C Traps and Pitfalls》 FILE *fp; fp = fopen(file, "r+"); 在我们使用这段代码打开一个文件后,我们并不能随心所欲的对文件进行读写 为了保持与过去不能同时进行读写操作程序的向下兼容性,一个输入操作不能随后直接紧跟一个输出操作,反之亦然。 如果要同时进行读写,需要在其中插入fseek函数调用 CSAPP第十章系统级IO也有提到过这个问题,其中fflush也可以达到类似的效果,貌似是和IO库的缓冲区有关 相关的原因可以在stackov…
C++ 字符串分割 用过python语言的同学肯定知道,字符串split是一个非常好用的工具,但是很可惜的是C++并没有这样的函数((string, char) => vector<string>)供我们调用 这里我们来说一下用流实现的方法 首先明确流是什么? 流是一个对象,他创建了目标与源的连接。流可以从源获取信息,或者向目标地提供信息 对输入流来说,主要从中提取一些东西 operator>> 对输出流来说,主要将某些东西压入其中 operator<< C++有一个用于连…
嵌套注释 这个问题来自《C Traps and Pitfalls》 请编写一个测试程序,要求无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常编译(无错误消息出现),但是这两种情况下程序执行的结果却不相同。 提示:在用双引号括起的字符串中,注释符 /* 属于字符的一部分,而在注释中出现的双引号 "" 又属于注释的一部分 首先你可能会想,什么是嵌套注释 从编译器的角度来说,就是当处理注释的过程中,是允许继续读入 /* */ 这样的符号的 比如一个字符串 /*/**/ , 对于可以嵌套注释的编译…
链接 这篇文章是在我看完CSAPP第七章后对自己的理解做的一个总结, 也算是对书中第七章的内容做一个总结吧 适合已经看完第七章但是还没有把链接搞得很清楚的人,或者可以把这篇文章看做是对程序链接的一个概括,希望我的总结可以为你们带来启发 由于本人有点懒,所以并没有打算专门的画图来讲解,如果有同学没有看懂欢迎找我来讨论 这里我们用最简单的例子来进入今天的主题,假设你要两个c文件,main.c 和 sum.c,其中main里调用sum中的一个函数,我们使用这样的方式来编译这个程序 linux> gcc -o pro…
#include <stdio.h> int main() { int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; printf("%p\n%p\n", a[0], &a[0]); printf("%p\n%p\n%p\n%p\n", a[0] + 1, (&a[0] + 1), (&a[0]) + 1, a + 1); int (*p)[3] = &a[0]; int (*q) = a[0]; // printf("%p\n%p", ) prin…