C++ 作为刷题语言的优势
在使用 Java 刷题超过 400 道之后,我几乎是在一夜之间决定全面转向 C++。起因说起来可能会令人嘲笑,是因为仰慕各位大佬......打开 LeetCode 的天梯榜,全球前五十里面一水的 C++。作为 IT 届皇家马德里的谷歌,也给人留下喜欢招 C++ 选手的刻板印象。这并不是说谷歌真的有偏好,而是能去谷歌的都是算法方面最强的那批人,aka 竞赛党,而 C++ 是 ACM、OI 等算法竞赛的官方语言,所以高手大概率都用 C++ 而已。
在讨论 Java 的缺点之前,先来总结一下 Java 的优点。一是和工程高度绑定。在后端开发领域,Java 占据着绝对的主流地位,基于 Java 开发的 Spring 全家桶,也是各大企业首选的后端技术栈。使用 Java 刷题,能够同时巩固相关的语法和 API,对于时间紧迫的转码选手来说事半功倍;二是 Java 的社区非常繁荣,用的人多,相关的题解也是最多的,遇到不懂的地方总是能搜到相关的讨论;三是设计严谨。Java 严格遵守面向对象的设计原则,遇事不决就 new 一个,没有什么骚操作(没错说的就是 JS,关于 JS 因为设计不严谨演变出来的各种 hack,以后可以单独开一篇文章来讲讲),写起来一板一眼的,有助于初学者培养良好的代码习惯。
严谨的语法对于初学者来说就像骑摩托车戴上各种护具一样,能充分保障行驶的安全。然而,随着熟练度的提高,这些护具反而成为了掣肘的累赘。
C++ 在心智负担上的优势
在上手 C++ 之后,令我感受最深的就是,可以少打好多字......C++ 能让我更加专注在算法的逻辑上面,而不是维护代码的格式上面。
假设我们需要声明一个可以动态扩展的整数数组:

假设我们需要声明一个长度为 100,初始值为 -1 的数组:

假设我们需要声明一个 100 * 100 * 100 的三维布尔数组,初始值设定为 true:

假设我们想做一个哈希表:

假设我们有一个字符串 s = "abcde",我们要将第二位上的 "c" 改成 “z”:

假设我们有一个字符串 s = "abcde",我们要在最后一位加一个 ‘f’:

C++ 在语法上的简洁度可以说是把 Java 吊起来打。此时有人就要抬杠了,比起简单,Python 说自己第二,没人敢说自己第一,做一个数组甚至只需要 arr = [] 即可。诚然,Python 在语法上非常简单,但有几个比较致命的问题,一是缺少内置的红黑树实现,导致缺乏 TreeMap 这样的数据结构;二是用 Python 面试,因为语法糖过多会给人一种取巧的感觉,容易被面试官鄙视.......三是 Python 这种高度封装的弱类型语言,性能太差了,Python 一般不会用在大项目上,而会更多地用于人工智能和数据分析领域。
那既然谈到性能,就不得不提起 C++ 的另一个优势。
C++ 在运行速度上的优势
大多数 OJ 平台的时限都是 1 秒,而 C++ 一秒内大概能进行 10^7 次运算。我记得有一道题的数据范围是 10^6 级别,同样的解法,C++ 能过,但 Java 就超时了(数据范围要降低到 10^5 Java 才能过)。以我浅薄的理解,应该就是封装程度导致的问题。Java 这个语言,本身就是用 C++ 写出来的,相当于本来两个人可以直接对话,现在多加了一个人,中间还要经过一次翻译,效率自然就下降了。
同时,Java 的各种 API 也或多或少存在效率上的问题。最明显的应该是 String 的 size() 方法,两种语言在写法上是一样的,但是我猜测 Java 的 String 没有维护容器内元素的数量,每次取得长度都要从头到尾遍历一次,如果放在 for 循环的条件里,效率会低得离谱。相反,C++ 的字符串底层是用数组实现的,类似 Java 的 arr.length 属性,访问起来快很多。
Java 在 API 上的低效还有另一个方面的体现,而这个点也是一直萦绕心头,并促使我转向 C++ 的重要原因之一。
C++ 在输入输出上的优势
算法题的形式一般是两种,一种是像 LeetCode 那样,模板先帮你写好,你只需要写函数体内的逻辑即可;另一种是 Codeforce 那样,一行代码都没有,完全空白的,需要自己引入头文件,也需要自己从控制台读入数据。有一些公司的 OA 平台也是这样的形式,虽然占比比较少,但万一遇到了呢?
比如说我们要读入两个整数,输出这两个整数的和,Java 需要这样写:

而 C++ 只需要:

C++ 靠着 cin,cout,scanf(),printf() 就能走天下,形式简单,速度还巨快,比起 Java 来是方便太多了。Java 不仅繁琐,效率低下,API 还有一堆限制,读入整数、字符还都是不同的写法......也难怪没人用 Java 打比赛,可能别人都 AC 了,你还在处理输入输出。
以厨具作为类比,Java 就是炒菜机,切菜机,烤箱等等半自动工具,你需要记住每种工具的方法,好用倒是也挺好用的,小白按照操作方法也能做出好吃的菜,就是做不出什么超越常规的料理;而 C++ 就是给大厨用的一套顶级厨具,光刀就十几把,切肉的,切菜的,雕花的,小白用起来容易被割伤,但大厨用起来可是相当顺手。
语言本身没有优劣之分,不同的语言有着不同的应用场景。JavaScript 有很多的缺点,但并不妨碍它成为 Web 开发领域的第一语言。单就「做算法题」这个场景来说,C++ 以其简洁的语法,全面的数据结构和极高的运行效率长盛不衰,牢牢占据着总统山的 C 位。
一周前如果有人问我刷题的最佳语言是什么,我可能会说其实都一样,看自己兴趣;但是现在,我会毫不犹豫地向他推荐算法领域的终极答案: C++。
© 本文版权归 GlintonLiao 所有,任何形式转载请联系作者。
© 了解版权计划