其实这是一个多次折中妥协后的方案。据我所知,评测时故意不允许编译优化的编程比赛只剩NOI和NOIP了。五年前,反对STL比现在做得更彻底,NOIP里干脆禁止STL的所有容器类和泛型算法,主要动机来源于三个方面:
理由1. 数据结构本身也是考点,STL帮选手做了太多的事情
理由2. PASCAL没有这些东西,工具之间存在不平衡
理由3. 老师不懂,教不动。学生太笨,学不会。时间太少,没法教,这属于“超纲内容”
后来之所以STL又允许用了,一方面可能是组委会觉得这样不妥,一个编程比赛,用的C++语言竟然是标准的阉割版,而且到底阉割了多少东西,还很难解释清楚。另一方面,也阉割不干净。选手可以想出各种不直接include头文件但也可以使用map的办法。
于是CCF干脆在编译上做文章了:你问我支持不支持STL,我当然支持,但是编译优化是不开的,如果将来程序超时,你们是要负责的!这个法子倒是巧,首先减少了自己的工作量,还堵住了众STL粉的嘴,事实上也让懂行的放弃了map(一部分小学生还是敢用,看他们的运气和机智程度了)。其实这么做也很荒唐,STL变成了一只随时可能超时的怪兽,连min和max函数都不知道该不该用了,C++标准委员会动了这么多心思让STL的效率不至于落后,现在被CCF这么一搞,作何感想呢?
其实另一个思路是,既然Pascal不够强大,干脆完全放弃Pascal吧,这样就不存在公平问题了。听说CCF还真的这么提议过,但一部分中学教师反对。很多教师常年用Pascal教学,已经成了习惯,他们坚持Pascal有教学上的优势。
在我看来,Pascal作为教学语言,有优势但微乎其微。不过它的IDE比dev c++好很多,能单步调试,能查看变量,对初学语言的人来说是方便多了。但归根结底的问题在于,市面上没有适合给初学者使用的,强大且稳定且免费且标准且轻量级且能原生运行在Windows下的C++ IDE。尽管这样,Pascal早晚会退出竞赛舞台,因为老师傅们总有退休的时候。于是理由2会在几年后就会自动消失。
(感谢
@林阿三的回复,他说Codeblocks不错,我也觉得是不错的,可惜这还不是CCF认可的IDE)
理由1的出发点我是赞同的,但我得到的结论恰恰相反——学STL其实是促进学习数据结构的,这世界上不存在学了一样东西会让你不去学另一样东西,只有懒惰才会阻止你继续学习。想学好STL应先学好数据结构,不学是走不远的,所以学点STL反而能激励学生钻研数据结构。
理由3才是现实的问题。ACM-ICPC选手有足够的时间掌握STL,但高中生周一到周五都要上课的,除非起步很早或很聪明,要不学这东西的时间是不太够。到底这算不算超纲内容,是比赛需要禁止的呢?需要不需要像数学高考一样,不允许看到使用微积分解题呢?我觉得支持反对都有道理。
最后我要为限制使用STL说点话:学术竞赛和工程实践是有区别的,实践中当然不推荐重复造轮子,但在学习的过程中,重复是一个很重要的过程。我教学的时候,尽可能让学生重复写快速排序,堆等等算法,平时练得熟一点绝对有好处,如果能做到这点,比赛的时候让不让用STL其实就没关系了。
综上所述,不许编译优化的出发点就是不让选手舒舒服服地用STL,不让选手舒舒服服地用的目的就是上面提到的三个理由,主要就是还有一部分人不会用STL,为了搞平衡。