unordered_map的排序
unordered_map 的排序
unordered_map
是C++的哈希表结构, unorded_map
并不能直接排序, 如果要排序,一般来说需要将unordered_map
转换为vector
再通过自定义排序函数使用sort
进行排序。
实例:
1 | bool cmp(pair<char, int>& a, pair<char,int>& b) { |
unordered_map
是C++的哈希表结构, unorded_map
并不能直接排序, 如果要排序,一般来说需要将unordered_map
转换为vector
再通过自定义排序函数使用sort
进行排序。
实例:
1 | bool cmp(pair<char, int>& a, pair<char,int>& b) { |
二叉树的知识每次用都要重新复习一遍,所以索性写一篇博客加强记忆
二叉树的遍历有四种方式:前序遍历、中序遍历、后续遍历、层序遍历,下面主要通过递归和显式栈的方式来实现前中后序遍历, 层序遍历使用队列实现
前中后序遍历可以简便的记为: ‘中’的位置,即
前序遍历为:中左右
中序遍历为:左中右
后续遍历为:左右中
文件描述符在Unix系统中是一个整数,用来标识打开的文件或者I/O资源,每个进程默认会打开三个标准文件描述符(File Descriptors, FDs),用于处理输入和输出。下面介绍这三个FD
0
<
或 <<
进行重定向(如 command < input.txt
)1
>
或 >>
进行重定向(如 command > output.txt
)2
2>
或 2>>
重定向错误(如 command 2> error.txt
)
-c
: 只编译但不链接, 生成目标文件(.o), 无法识别的文件将被忽略; 原文:Compile or assemble the source files, but do not link. The linking stage simply is not done. The ultimate output is in the form of an object file for each source file.
By default, the object file name for a source file is made by replacing the suffix ‘.c’, ‘.i’, ‘.s’, etc., with ‘.o’.
Unrecognized input files, not requiring compilation or assembly, are ignored.
-S
: 将源代码编译成汇编代码,而不是直接生成机器代码或可执行文件。使用这个选项时,GCC会执行编译过程中的前几个步骤(如预处理、编译),但会停在生成汇编代码这一步,不会进一步进行汇编成目标代码或进行链接。
-E
: -E选项用于仅执行预处理步骤。GCC会处理源代码中的预处理指令,如宏定义的扩展、条件编译指令的处理、包含文件的插入等,但它不会编译、汇编或链接代码。注意: 默认情况下,这个输出会直接发送到标准输出(即屏幕), 所以可以使用|
传到vim或者其他编辑器中查看:
1 | gcc -E helloworld.c | vim - |
-o
: 这一部分强烈推荐看原文, -o
选项允许指定主输出文件的名称和位置,这适用于任何类型的输出,无论是可执行文件、目标文件、汇编文件还是预处理的C代码。
原文
some notes:
返回值: main()的返回值应该是int, 而不是void. 虽然在一些编译器中,void main()可以通过编译,但并非所有编译器都支持 void main(),因为标准中从来没有定义过 void main 。
main返回值类型:
main()函数传参
1 | int main(int argc , char* argv[],char* envp[]); |
参数说明:
①、第一个参数argc表示的是传入参数的个数 。
②、第二个参数char* argv[],是字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]:指向程序运行的全路径名。
argv[1]:指向执行程序名后的第一个字符串 ,表示真正传入的第一个参数。
argv[2]:指向执行程序名后的第二个字符串 ,表示传入的第二个参数。
……argv[n]:指向执行程序名后的第n个字符串 ,表示传入的第n个参数。
规定:argv[argc]为NULL ,表示参数的结尾。
在读nemu/src/monitor/monitor.c中遇到了这个函数,原文如下:
1 | static inline void parse_args(int argc, char *argv[]) { |
从状态机视角理解程序运行
1 | // PC: instruction | // label: statement |
Q:画出这个程序的状态机
需要更新的状态只包括PC,r1和r0,所以用三元组表示程序的所有状态:
(0, x, x) -> (1, 0, x) -> (2, 0, 0) -> (3, 0, 1) -> (4, 1, 1) -> (2, 1, 1) -> (3, 1, 2) -> (4, 3, 2) -> … -> (2, 4851, 98) -> (3, 4851, 99) -> (4, 4950, 99) -> (2, 4950, 99) -> (3, 4950, 100) -> (4, 5050, 100) -> (5, 5050, 100)
(0, x, x) -> (1, 0, x) -> (2, 0, 0) -> ..
, 以我的感觉我极有可能会写(0, 1, x) -> (1, 0, 0) -> .. 我的逻辑是在pc0
的时候,r1
赋值为0了, 但是在状态机中表示的是一个瞬间的状态所以在pc0
的时候, r1
还没有被赋值,所以上面的(0, x, x)是对的cd <directory>
: 更改当前工作目录到指定的目录。pwd
: 显示当前工作目录的完整路径。mkdir <directory>
: 创建一个新目录。rmdir <directory>
: 删除一个空目录。如果目录非空,使用rm -r <directory>
。ls [options] [file]
: 列出目录内容。-l
: 长格式列出信息。-a
: 列出所有文件,包括隐藏文件。-h
: 与-l
一起使用时,以易读的方式显示文件大小。cp [options] <source> <destination>
: 复制文件或目录。-r
或 --recursive
: 递归复制目录及其内容。-i
或 --interactive
: 在覆盖文件之前提示用户确认。-v
或 --verbose
: 显示详细信息。rm [options] <file>
: 删除文件或目录。-r
或 --recursive
: 递归地删除目录及其内容。-f
或 --force
: 强制删除,不提示确认。mv [options] <source> <destination>
: 移动或重命名文件或目录。tar [options] <filename> [files]
: 用于归档文件,同时可对文件进行压缩或解压。-c
: 创建归档。-x
: 从归档中提取文件。-z
: 通过gzip进行压缩或解压。-v
: 显示被处理的文件名。-f
: 指定归档文件的名称。