最近,在阅读这篇博文之后,我有一个危险的想法.这个想法可以这样表达:
我不需要C++标准库提供的大部分内容.那么,为什么我不实现一个不太通用但更易于使用的版本?
作为一个例子,使用STL吐出大量难以理解和损坏的编译器错误.但是,我不关心分配器,迭代器等.那么为什么我不花几个小时来实现一个易于使用的链表类,例如?
我想从StackOverflow社区了解到的是:对于C++中的大多数现有功能而言,"滚动我自己"有哪些危险,可能的缺点和可能的优势?
编辑:我觉得人们对这个想法误解了我.当时的想法是要了解自己是否可以实现一个非常小的一组被大大简化STL功能-更多的项目来教我关于数据结构等.我不建议从头开始重新发明整个车轮,只是我需要和想要了解的部分.我想我想弄清楚的是,使用STL的复杂性是否需要创建更小,更简单的版本.
重新使用提升或类似.
我编写的大部分内容都是针对大学的,我们不允许使用外部库.所以它可以是C++标准库,也可以是我自己的类.
这个问题的客观性.
这个问题不是主观的.也不应该是社区维基,因为它不是民意调查.我想要具体的论点,强调我的方法可能出现的一个优点或一个缺点.与流行的看法相反,这不是意见,而是基于经验或良好的逻辑论证.
格式.
请为每个答案发布一个缺点或一个优势.这将允许人们一次评估个人想法而不是所有想法.
请...
没有宗教战争.我不是任何语言的粉丝.我用任何适用的东西.对于图形和数据压缩(我目前正在研究的),似乎是C++.请限制您对问题的回答,否则他们将被低估.
那么,为什么我不实现一个不太通用但更易于使用的版本?
因为你做不到.因为你可能会对C++说些什么,它不是一种简单的语言,如果你还不是很擅长它,你的链表实现就会出错.
老实说,你的选择很简单:
学习C++,或不使用它.是的,C++通常用于图形,但Java也有OpenGL库.C#,Python和几乎所有其他语言也是如此.或者C.您不必使用C++.
但如果您使用它,请学习它并正确使用它.
如果需要不可变字符串,请将字符串创建为const.
无论其底层实现如何,STL使用起来都非常简单.
可以读取C++编译器错误,但需要一些练习.但更重要的是,它们并不仅限于STL代码.无论你做什么,你会遇到它们,以及你使用哪些库.所以习惯他们.无论如何,如果你习惯了它们,你也可以使用STL.
除此之外,还有一些其他缺点:
没有人会理解你的代码.如果您在SO上询问有关std :: vector或双向迭代器的问题,那么对c ++有相当熟悉的人都可以回答.如果您询问My :: CustomLinkedList,没有人可以帮助您.这是不幸的,因为滚动你自己也意味着会有更多的错误要求帮助.
你试图治愈症状,而不是原因.问题是你不懂C++.STL只是一个症状.避免STL不会神奇地使您的C++代码更好地工作.
编译错误.是的,他们讨厌阅读,但他们在那里.STL中的许多工作已经用于确保在大多数情况下错误使用会触发编译器错误.在C++中,编写可编译的代码非常容易,但不起作用.或似乎工作.或者在我的电脑上工作,但在其他地方神秘失败.您自己的链接列表几乎肯定会将更多错误移动到运行时,它们将在一段时间内未被检测到,并且更难以跟踪.
再次,它将是错误的.相信我.我看到该死的好C++程序员用C++编写一个链表,只是为了揭示bug之后的bug,在不明显的边界情况下.而C++就是所有边境案例.您的链接列表是否会正确处理异常安全?如果创建一个新节点(从而调用对象类型的构造函数)会抛出异常,它会保证一切都处于一致状态吗?它不会泄漏内存,将调用所有适当的析构函数?它是否类型安全?会有效果吗?在C++中编写容器类时,要处理很多麻烦.
你错过了任何语言中存在的最强大和最灵活的库之一.即使使用Java庞大的类库,STL也可以做很多事情.C++已经足够难了,不需要抛弃它提供的一些优势.
我不关心分配器,迭代器等
可以安全地忽略分配器.你甚至不需要知道它们存在.虽然迭代器非常出色,但将它们弄清楚可以为您节省很多麻烦.要有效使用STL,您只需要了解三个概念:
容器:您已经了解这些.矢量,链表,地图,集,队列等.
迭代器:允许您以流的形式在磁盘上导航容器(或容器的子集,或任何其他值序列,或在运行中计算)的抽象.
算法:适用于任何迭代器对的通用算法.你有排序,for_each,find,copy等等.
是的,与Java的库相比,STL很小,但是当你结合上述3个概念时,它包含了惊人的功率.有一点学习曲线,因为它是一个不寻常的库.但如果你要用C++花一两天以上的时间,那就值得学习.
不,我没有按照你的答案格式,因为我认为实际上给你一个详细的答案会更有帮助.;)
编辑:
很有诱惑力地说,你自己的优势在于你可以学到更多的语言,甚至可能为什么STL是其中的优点之一.但我并不是真的相信它是真的.它可能会奏效,但它也会适得其反.
正如我上面所说,编写似乎有用的C++代码很容易.当它停止工作时,很容易重新排列一些东西,比如变量的声明顺序,或者在类中插入一些填充,以使它看起来再次起作用.你会从中学到什么?这会教你如何编写更好的C++吗?也许.但最有可能的是,它只是教你"C++糟透了".它会教你如何使用STL吗?当然不.更有用的方法可能是利用StackOverflow的强大功能以正确的方式学习STL.:)
缺点:没有人,但你会使用它.
优势:在实施过程中,您将了解为什么标准库是一件好事.
优点:吃自己的狗食.你完全得到你所做的.
缺点:吃自己的狗食.许多人,比我们99%的人聪明,花了数年时间创造STL.
我建议你了解原因:
使用STL吐出大量难以理解和损坏的编译器错误
第一
缺点:您可能花费更多时间来调试您的类库,而不是解决您面前的任何大学任务.
优势:你可能会学到很多东西!
关于神秘的编译器STL错误消息,您可以做些什么.STLFilt将有助于简化它们.来自STLFilt网站:
STLFilt简化和/或重新格式化冗长的C++错误和警告消息,重点关注与STL相关的诊断(对于MSVC 6,它完全消除了C4786警告及其碎屑).结果使许多甚至最神秘的诊断都易于理解.
看看这里,如果你使用VisualC,也在这里.
我想你应该这样做.
我敢肯定我会为此感到高兴,但是你知道,这里的每个C++程序员都喝了太多的STL coolaid.
STL是一个很棒的图书馆,但我从第一手经验中知道,如果你自己动手,你可以:
1)使其比特定用例的STL更快.2)你将只用你需要的接口编写一个库.3)你将能够扩展所有标准的东西.(我不能告诉你我多么希望std :: string有一个split()方法)...
当他们说这将是一项很多工作时,每个人都是对的.确实如此.
但是,你会学到很多东西.即使在你写完之后,你又回到STL并且再也不用它了,你仍然会学到很多东西.