使用cin和cout较scanf()和printf()的优点: cin的输出不需要指定格式,也不需要加取地址符(&),直接写变量名,同样cout也是不需要指定格式,还可以使用endl刷新缓冲区(flush)和换行(\n)达到换行的目的。 而scanf()输入变量需要指定格式,还需要取地址符(&),printf()输出变量也需要指定格式。
使用cin和cout较scanf()和printf()的的缺点: 流使得 pread() 等功能函数很难执行。如果不使用 printf 风格的格式化字符串, 某些格式化操作 (尤其是常用的格式字符串 %.*s) 用流处理性能是很低的。流不支持字符串操作符重新排序 (%1s), 而这一点对于软件国际化很有用。并且在OJ提交题目时,由于流属于IO类对象以及重载了operator<<()和operator>>()函数,在处理大量的数据时由于调用流对象和重载函数必然导致超时!
结论:不要使用流cin/cout,除非是日志接口需要。使用 printf 之类的代替。使用流还有很多利弊,但代码一致性胜过一切。 不要在代码中使用流。 在OJ中使用printf和scanf函数,不要使用cin和cout输入输出变量值避免题目还没提交导致超时现象。即在十分必要下才使用cin和cout,一般使用printf和scanf。
拓展讨论: 对这一条规则存在一些争论, 这儿给出点深层次原因. 回想一下唯一性原则 (Only One Way): 我们希望在任何时候都只使用一种确定的 I/O 类型, 使代码在所有 I/O 处都保持一致. 因此, 我们不希望用户来决定是使用流还是 printf + read/write. 相反, 我们应该决定到底用哪一种方式. 把日志作为特例是因为日志是一个非常独特的应用, 还有一些是历史原因。
流的支持者们主张流是不二之选, 但观点并不是那么清晰有力。 他们指出的流的每个优势也都是其劣势。流最大的优势是在输出时不需要关心打印对象的类型。 这是一个亮点, 同时,也是一个不足:你很容易用错类型, 而编译器不会报警. 使用流时容易造成的这类错误:
cout << this; // 输出地址 cout << *this; // 输出值由于 << 被重载, 编译器不会报错。 就因为这一点我们反对使用操作符重载。 每一种方式都是各有利弊, “没有最好,只有更适合”。简单性原则告诫我们必须从中选择其一,最后大多数决定采用 printf + read/write。
部分笔记来自:《Google的C++代码规范》《算法笔记》