最近,我已经有了一个危险的想法进入我的头后读取 博客。这个想法可以表示这样的:

我不需要什么最C++标准图书馆提供。所以,为什么我不能实现一个不太大,但更易于使用的版本吗?

作为一个实例,使用的STL吐出来大量的不可理解和错位编译错误。但是,我不关心分配、迭代程序等。所以为什么我不需要几个小时和实施一个易于使用的链表类,例如?

我想知道从计算器的社区是这样的:什么是危险、可能的缺点和可能的优势"滚是我自己"对于大多数的现有功能在C++?

编辑: 我觉得人们误解我关于这一想法。当时的想法是来了解我是否可以实现一个 非常 小组STL功能,该功能大大简化-更多的为一个项目,以教我关于数据结构等等。我不打算重新发明了整个车轮从地上爬起来,只需一部分,我需要和想要了解有关。 我想我想要找出是是否复杂性使用的限令建立较小的、更简单的版本身。

重新采用提高或类似。

最什么,我的代码是大学并且我们不允许使用外部图书馆。所以这是C++标准图书馆,或是我自己的课程。

客观性这一问题。

这个问题是 主观的。也不应该社区维基,因为它不是一项民意调查。我想具体论点,突出强调一个优点或缺点之一可以 可能的 发生与我的办法。流行的看法相反,这是不是意见,但在经验的基础上或良好的合乎逻辑的论点。

格式。

请职位只有一个缺点 一个优点每答案。这将允许的人,以评估个人的想法而不是你所有的想法。

请...

没有宗教战争。我不喜欢男孩的任何语言。我使用的任何适用的。对图形和数据压缩(什么我工作的那一刻),这似乎是用C++.请限制问题的答案,或者他们将downvoted.

有帮助吗?

解决方案

所以,为什么我不能实现一个更小 大,但更易于使用的版本吗?

因为你不能。因为其他什么你可能会说,关于用C++,它不是一个简单的语言,并且如果你不是已经非常良好的在这,你的链表的执行将越野车。

老实说,你的选择很简单:

学习C++,或者不要使用它。是的,C++是通常使用的图形,但Java有照片图书馆。所以没C#、蟒蛇及几乎每一个其他语言。或C。你没有使用C++。

但如果你使用它,学习和使用正确。

如果你想要串不可改变的,创造你的串为const。

而不管其潜在的实施,STL是非常简单的使用。

C++编译错误。 可以 能阅读,但它需要一点实践。但更重要的是,他们不是专为STL代码。你会遇到他们,无论你做什么,以及图书馆使用。因此,获得用于他们。如果你要用于他们无论如何,你很可能会成为使用STL。

除此之外,其他几个缺点:

  • 没有人会理解你的代码。如果你问一个问题上,使关于性病::矢量,或双向的迭代,每个人都是合理的熟悉c++可以回答。如果你问的靠我的::CustomLinkedList,没有人可以帮助你。这是不幸的,因为自己也意味着将有更多的错误要求的帮助。
  • 你在试图治愈的症状,而不是原因。问题是你不理解。STL只是一个症状。避免了STL不会奇迹般的让你C++代码的工作做得更好。
  • 编译器的错误。是的,他们讨厌读,但他们在那里。很多的工作STL已经成为确保错误的使用将触发的编译错误,在大多数情况下。C++它很容易编码编制,但不会的工作。或似乎工作。或者工作在我的电脑,但没有神秘的地方。你自己的链接清单几乎肯定将更多的错误要运行时,在那里他们会检测不到,并能更加难以追查。
  • 再一次,这将是越野车。相信我。我已经看到了该死的好C++编程人员编写了一个链接清单C++只发现错误之后的错误,在模糊边界的情况。和C++是所有边界的情况。将你的链表处理异常安全是否正确?将它保证一切都是在一个一致的国家如果创造一个新的节点(和由此而调用对象类型的构造)引发一个例外吗?它不会泄露存储器,即所有适当析构将被称为?将它作为类型的安全吗?它将可作为高性能的?有很多头痛的处理当写入容器类在C++。
  • 你错失了一个最强大和灵活的库存, 任何 语言。STL可以做很多,这将是一个痛苦,甚至与Java的巨大臃肿的类图书馆。C++是硬已经足够,不需要扔掉的几个优点,它提供。

我不关心配给器, 迭代等

分配可以被忽略。你很少甚至不需要知道它们的存在。迭代辉煌虽然,并找出他们将会节省很多麻烦。只有三个概念需要了解到使用STL有效:

  • 容器:你已经知道这些。向量、链表、地图集、排队等等。
  • 迭代:抽象,让我们浏览一个容器(或子的容器,或其他任何序列的数值,在存,在盘形式的流,或者计算在飞)。
  • 算法:常用算法的工作 任何 对迭代器。你有种,for_each,找到复制和其他许多人。

是的,STL相比是很小的Java的图书馆,但是它包的数量惊人的力量,当你结合上述3概念。有一个学习曲线上,因为这是一个不寻常的图书馆。但如果你要花超过一天或两用C++,这是值得学习正常。

不,我不跟你回答的格式,因为我认为实际上给你一个详细的回答会更有帮助。;)

编辑:

这将会是很有诱惑力的说,一个优点滚你自己,你想了解更多的语言,甚至可能为什么STL是其一个省的青睐..但我并不真正相信它是真实的。它可能工作,但它可能会适得其反。

正如我前面所说,它很容易编写C++的代码 似乎 到工作。当它停止工作,它很容易重新安排一些事情,如《宣言》序的变量,或者插入位的填充的一类,使它 看似 重新工作。你会学习这个?那会教你如何编写更好C++?也许。但最有可能的,这只会教你"C++吸".它会教你如何使用STL?绝对不是。一个更有用的方法可被利用的真棒电的计算器在学习STL正确的方式。:)

其他提示

缺点: 没有一个但你会用它。

优势: 在执行它,你会了解为什么标准图书馆是一件好事。

优点:吃自己的狗食。你得到你做什么。

缺点:吃自己的狗食。许多人,我们更聪明的99%以上,多年来一直在创造STL。

我建议你了解为什么:

  使用STL

吐出的令纸   难以理解的错位编译   错误

第一

缺点:可能会花费更多的时间调试类库不是解决你在你面前的任何大学的任务

优点:你可能会学到很多东西。

也有一些是你可以做的神秘的编译器STL的错误消息。 STLFilt将有助于简化他们。从 STLFilt网站

  

STLFilt简化和/或重新格式化   冗长C ++错误和警告   信息,重点是STL相关   诊断(和MSVC 6,它充分   消除了C4786警告和他们的   碎屑)。其结果使得许多   即使是最神秘的诊断   理解的。

看一看 rel="noreferrer">,如果你正在使用VISUALC,也的此处

我觉得你应该这样做。

我敢肯定,我会得到flambayed这一点,但你知道,在这里每一个C ++程序员已经喝得有点太多了STL coolaid。

在STL是一个伟大的图书馆,但我从第一手经验知道,如果你滚你自己的,你可以:

1),使它比STL快为您的特定用例。 2)你会写一个库,正是您所需要的接口。 3)您可以延长所有标准的东西。 (我不能告诉你有多少我希望的std :: string有一个split()方法)...

时,他们说,这将是一个大量的工作,每个人都是正确的。这就是真实的。

但是,你会学到很多东西。即使你写后,你回到STL,从来没有再次使用它,你还是学到了很多东西。

缺点:IMHO,reimplimenting测试和验证库是被几乎保证下,更麻烦比它值得一RABIT孔

我体验了一下:不是很久以前,我已经实现了我自己的向量类类,因为我需要它很好的控制。

正如我需要泛型我制成的模板阵列。

我还希望来遍历它不使用操作符[],但递增像的指针将使用C做,所以不计算的T [I]在每次迭代...我添加了两个方法中的一个地址返回指针,返回一个指针到最后分配的内存和另一个。 通过整数的数组迭代我不得不写是这样的:

for(int * p = array.pData(); p != array.pEnd(); ++p){
  cout<<*p<<endl; 
}

然后,当我开始使用我弄清楚,当它是一个可能会分配的,而不是调用新的多次大内存集团载体的载体。这时我想补充一个allocator的模板类。

只有这样,我注意到,我已经写了性病的完全无用的克隆::向量<>。

至少现在我知道为什么我用STL ...

另一个的缺点

如果你想获得一个C ++的工作,当你与大学,谁愿意招你会期望你所熟悉的标准C ++库大多数人完成。不一定非常熟悉到执行层面,但肯定熟悉它的用法和成语。如果重新实现在自己的库形式的车轮,你会错过这样的机会。这是nonwithstanding的事实,你会希望学到很多关于库设计,如果你滚你自己,这可能会为您赚取一些额外的加分,这取决于你的采访。

缺点:

您要介绍你自己的新库的依赖性。即使那是足够的,以及实现正常工作,你仍然有依赖性。这可以用代码维护硬咬你。其他人(包括你自己,在一年的时间内,甚至一个月),将不熟悉你的唯一字符串的行为,特别迭代器,等等。很大的努力将需要只是为了适应新的环境,你所能开始重构/延长任何东西之前。 如果你使用类似STL,每个人都已经知道了,这是很了解和记录,没有人将不得不重新学习您的自定义一次性的环境。

您可能有兴趣在 EASTL ,STL的电子艺界的重写记录而回。他们的设计决策大多是通过多平台视频游戏编程的具体欲望/需求所驱动。链接的文章中的抽象的概括起来很好。

缺点:你的大学课程可能是奠定了这样的一个原因。你是足够激怒通过它(讽刺不打算),这一事实可能表明你没有得到的paridigm,当你有一个范式转变将受益匪浅。

<强>优势

如果你看看MFC中,你会发现,你的建议已经在生产代码中使用 - 并且已经等了很长一段时间。 MFC的集合类没有使用STL。

你为什么不看看现有的C ++库。回来时,C ++不太成熟,人们经常写自己的库。看看塞班(相当可怕虽然),Qt和wxWidgets的(如果没记错的话)有基本的集合之类的东西,而且有可能是其他许多人。

我的看法是,STL的复杂性从C ++语言的复杂性派生,而几乎没有可以做,以提高STL(除了使用一个更明智的命名约定)。如果可以的话,我建议简单地切换到其他语言,或者只是对付它。

  

作为一个例子,使用STL吐出   不可理解和错位里姆斯   编译器错误

这样做的原因是基本上C ++模板。如果你使用模板(如STL做),你会得到令人费解的错误消息[R的 EAMS。所以,如果你实现自己的基于模板的集合类,你不会在任何更好的位置。

您可以使非基于模板的容器和所有都void指针或一些基类例如但是你会失去编译时类型检查和C ++吮吸作为一种动态语言。这是不是安全的这样做,因为这将是如的Objective-C,Python或Java的。其中一个原因是,C ++不具备的所有类根类中的所有对象的所有反省和一些基本的运行时错误处理。相反,您的应用程序可能会和好如初,如果你是错的类型,你会不会给任何线索,出了什么问题。

<强>缺点:重新实现所有的那以及(即,以高的质量水平)肯定会采取一些大的开发人员几年。

  

什么是危险的,可能的缺点和可能的优势,“我自己的滚动”对于大多数的C ++中的现有功能?

你能负担得起,并可能证明的努力/时间/钱也花了后面重新发明轮子的金额是多少?

  

重新使用升压或similiar。

而奇怪的是,你不能使用升压。 IIRC,贡献大块来自与人进来/在大学工作的(认为Jakko贾维)。使用Boost的上升空间有太多来港上市。

  

在不 '重新发明轮子'

缺点:当你学到很多,您还可以设置自己回来了,当你想起来你的真实项目的目标是什么

优点:维护对于谁将会继承这个人更容易

STL是非常复杂,因为它需要被用于一般目的的图书馆。

原因STL是它的方式是:

  • 根据interators使标准算法只需要一个单一的执行对不同种类的集装箱。
  • 设计的正常运行,在面对例外情况。
  • 设计成可线的安全在多线程的应用。

在很多应用程序,但是你真正有足够的如下:

  • string类
  • 哈希表O(1)查找
  • 矢量/数组与排序和二搜索排的集合

如果你知道:

  • 你的类不扔的例外情况在建设或分配。
  • 你的代码是个螺纹。
  • 你会不会使用更复杂的STL算法。

然后你大概可以写你自己的速度更快代码,使用更少的内存和生产的更简单的编译/运行时的错误。

一些例子更快的/更容易,而不STL:

  • 复制上写字符串的参考数字符串的缓冲区。(不这样做在一个多线程的环境,因为你会需要锁上的基准计访问。)
  • 使用一个很好的散列表,而不是std::设置和性传播疾病::图。
  • 'Java'风格的迭代,可以通过作为一个单一的对象
  • 迭代型的,不需要知道的类型容器(用于更好地编制时间脱钩的代码)
  • 一串级与更多的实用功能
  • 可配置的边界检查在你的矢量的容器。(所以不[]。但在同一方法编制或运行时间的标志,从'安全的'到'迅速'模式)
  • 容器的设计工作指针的对象,将删除其内容。

它看起来像你这样的更新的问题,所以现在真的有两个问题:

  1. 我应该怎么做,如果我认为std::图书馆是太复杂了我的需求?

设计自己的课程,在内部使用的相关标准::图书馆的功能以做到的"繁重"你。这样,你已经少得到错误的,你还是去创造你自己的编码的接口。

  1. 我应该怎么做,如果我想学习如何数据结构的工作?

设计自己的一套数据结构类从地上爬起来。然后试着找出为什么标准都是得更好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top