这篇文章的缘起有二:

  • 很多人主张「应当在几乎所有情况下使用 C 风格的 I/O」(比如这里),而我很怀疑;
  • 另一方面,在刷 POJ 的时候,使用 std::cin 确实能 TLE 而改成 std::scanf 就 AC 了,因此想试试看 std::cin 能否加速。

中文网络里,已有码农场byvoid 菊苣的讨论。不过二者对于原理的解释,自我感觉都不够清晰;又本着自己动手做实验的坚持,决定写下这篇文章,探讨 C++ 的读入速度的问题,特别是读入文件速度的问题。

阅读全文 »

大多数命令行工具,都会提供一些选项。在不同的选项组合之下,这些工具会有不同的行为。GNU 标准的命令行选项解析工具是 getopts,它比其兄弟 getopt 更为强大。除了介绍 getopts 的用法之外,这里还会介绍两种手工解析参数的方法。

在正式介绍之前,有必要区分几个概念(在 Shell 脚本中)。

  • Argument, Option: 中文对应「选项」,形如 -a, --save 的都是选项;选项可以接收参数(Parameter),也可以不接受参数。
  • Flag: 中文对应「标签」,形如 -v(verbose);标签是布尔值,不接受参数。

下面正式开始介绍。

阅读全文 »

LaTeX 中的 \footnote 命令可以产生脚注——在正文位置留下一个编号,在当前页的底部输出实际的注释内容。这个功能很好用,但是在一些情况下,可能产生意想不到的情况。

  • 数量少而大段的尾注导致尾注先于标记出现;
  • 数量多而小段的尾注导致尾注晚于标记出现。

这些不太寻常的注释会导致 LaTeX 标注文档类没有办法很好地处理脚注。这里,后者可以通过 footmisc 宏包的 para 选项来挽救,但是前者就没有什么好办法了。于是,我们想到了尾注。

阅读全文 »