大学为何从C语言学起,C++为何没讲STL

简介: 【来信】  我是一名普通的大学生,来自(  )大学。很抱歉这么晚打扰您,刚做完几个计算几何学的题目,还没来得及整理,看到您C++课堂系列的博客,想着,酝酿已久的邮件也该写了。  我有两个疑问,为什么学校不以C++作为入门语言?我现在正在搞ACM,知道C++在很多情况下不如C语言灵活,尤其是stl等工具的使用上,不能随心所欲编写想要的算法。但是,C++作为C语言的超集,面向对象的思想等等都是C语
【来信】
  我是一名普通的大学生,来自(  )大学。很抱歉这么晚打扰您,刚做完几个计算几何学的题目,还没来得及整理,看到您C++课堂系列的博客,想着,酝酿已久的邮件也该写了。
  我有两个疑问,为什么学校不以C++作为入门语言?我现在正在搞ACM,知道C++在很多情况下不如C语言灵活,尤其是stl等工具的使用上,不能随心所欲编写想要的算法。但是,C++作为C语言的超集,面向对象的思想等等都是C语言不可及的。它兼具其他面向对象语言的特性,并向下兼容C语言,在我看来应该拿它作为入门语言。当然,初读C++ Primer这类书的时候很难啃下来,但是如果结合上课讲解的知识,对C++有个大致的了解是没有问题的。像我们学校,仍旧拿C语言作为入门计算机语言,C++课程名字直接就是面向对象,有些不可思议。
  我的第二个疑问是,为什么学校不会介绍一个重要的工具——STL?它的正确性、稳定性和高效性已经被无数次验证,为什么学校不介绍它。我相信STL在真正的软件设计里面应用十分广泛的。

【回信】
  来信收到。你问了一个非常好的问题。不过我的回答也许让你失望,我今年1月去过你们学校调研交流,对你们学校在程序设计教学中的做法还是认可,并且作为一段时间以来要学习的。在我所在的学校,尽管第一门程序设计课称为程序设计基础或C++程序设计,在这个为时两学期的课中,第一个学期基本还是C的内容,讲C++中面向过程的程序设计,第二个学期是面向对象的部分。你们学校的分两门课的教学,中间还要插入一个以实践能力提高为主的短学时课程,其好处是明显的。
  要回答你的问题,必须明确,在大学里第一门程序设计课程中要解决的主要问题是:学会编程序。因此名为XX语言程序设计,重点在于程序设计方法,然而现实的考虑中也不得不将很大的精力投入到语言本身中来。学习第一门语言,首先在于能设计程序,至于用这个语言解决工程中实际问题的方案,倒是要放在其次了。在我的教学中,STL也只是会提及,并不作为要求。
  大学的课程是一个体系,想要实现的某一个目标常体现在多门课程中,并且各门课程之间能够形成承接关系。举一个例子,排序在学科中很重要,数据结构中有专门的内容,在程序设计入门课程中,也要初次尝试。这些尝试要比学会用STL中的sort算法更有意义,更应该放在优先的地位。再如,你正在做的计算几何问题,以及图形学课程中将要学习的算法,不是也有现成的图形包可以直接使用吗?实际上,大学的课程从用的角度有两方面的兼顾,一是能够直接用,二是要通过这种体系,为你将来进一步地理解STL、图形包之类的机制、工具提供支持。而后者,你应该意识到,这是专业人员,无论在思维方式上,还是对适应行业变化,甚至是引领行业变化的资本所在。
  有一句大家相传甚广的话你没有说出来:大学,有用的不教,尽教没有用的。从某种意义上这句话对,但是,在“用”的层次上多加区分之后,你会发现,直接用于工程,以及直接用于学习能力提高与思维方式改变,间接用于形成终身学习能力,适应技术的可能变化,这都是大学之用。在此当中,“直接用于工程”没有太多的突出,也不见怪。学习计算机的另外一些路子,市场用什么就学什么,想转做另外一个方向的工作,必须接受培训,他们所学的全部就是直接用于工程的知识。
  做了如上的解释,我不能回避学校教育中的缺失。我们正处在这个时期,其实真实的世界中,补上这个缺失,又会在新的发展阶段遇到新的不足。其中还有一个缺失是,没有让同学们体会到直接用和间接用之间的关系。我当老师多年,也深知在“读高中是为了考大学”,“上大学是为了找工作”这样的直接思维甚浓的条件下,大学在改变学生的学习方面,不只是只坚持目前该有的做法就算可以的了。C++课中是需要有STL的内容的,但在有限学时,以及不少学生在学习上的投入问题,其中的取舍,作为老师是有纠结的,当学生的,不同的人,根据情况,可以有不同的应对。
  意识到这一点,也就知道了,大学的教学计划只是一个公共的要求,是一个获得毕业证的最低标准,要知道除了老师教的,课外必须要有自己额外加的。这一部分是可以有充分的自主性的。你另加STL就是一个很好的做法。参加ACM竞赛要额外做大量练习,这也是一个超越教学计划的做法。在某个时期,需要,也可在应用能力提高上投入了,自行安排学习即是。如果届时选择用的语言是C++,把STL用熟,那是不可回避的事。上过了大学,就要有准备,也要练出自学能力,需要学的东西,并不一定需要人教。如果不去摆脱总让人教的思维,结果就是当技术发展了,你将不能主动地站到前沿,在等人教的过程中,面临无情的淘汰。
  回到你问的问题上,在工程中用哪种语言,根据需要去定。而实际上,在大学中程序设计入门,选用哪种语言,是可以有多种选择的。比如还有的学校用Java,国外开始有用Python的。这都是多种选择中的一种,各有利弊。作为学生,你的选择是,照你的学校安排的路线去执行。其中的不足,还要有课外的学习作为补足。上课只造就所有同学共性的地方,课外却使你拥有了自己的精彩。不同的同学在课外有了不同的选择,于是分出了水平上的阶梯,以及出现了各具特色的人才。

  用好你当前的教学计划中提供给你的帮助,开创出自己有效的自学,让你的大学更精彩。  


    

==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

  
目录
相关文章
|
8月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
388 2
|
11月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
373 26
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
788 73
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
671 3
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
435 21
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
955 1
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
369 2
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
524 7