在学习BOOST替代方案之前,我是否应该熟练掌握STL库?

时间:2009-02-14 08:26:27

标签: c++ stl boost

在学习C ++之后将自己限制在STL库中是否有意义,然后在熟练使用vanilla C ++之后解决boost及其添加问题?

或者你应该在学习C ++时潜入BOOST吗?

9 个答案:

答案 0 :(得分:39)

STL有一些核心概念。 Boost构建并扩展它们。如果您理解它们,那么直接进入Boost可能对您有用。如果没有,我会从STL开始。

  • 各种容器类型之间的区别(vectorlistdeque等序列,以及mapset和{{1}等关联}和multi*种类)。有时你可以互换一个 - 有时你不能。了解他们的优势和限制。
  • 迭代器的作用,以及它们如何在容器和算法之间提供桥梁。 (这个我发现我一遍又一遍地使用)。
  • 为什么有标准算法:它们通常是很少量的代码,因此它们存在的原因可能并不明显。了解他们使用哪些容器,以及如何针对特定情况对其进行专门化(例如,查看通用unordered_*与专用于copy的{​​{1}}的区别。)
  • 如何以及何时使用traits类。
  • 如何使用活页夹(copyconst char *bind1st):语法可能会模糊其效用。
  • 如何使用ptr_fun - 以及时使用它。 (所有字符串类都有权衡:学习标准的优点和缺点是教育性的。)
  • 流和streambufs之间的区别:如何使用前者进行格式化I / O(尝试从流中读取字符串:它不是应该如此简单),而后者要做低级别的快速I / O。

用于设计STL的原则是由Boost库构建和扩展的。如果你得到它们,Boost是可管理的。如果你不这样做,并且Boost最终难以遵循,你可以回到STL来获得你的支持。

(总的来说,Boost确实推动了语言的界限。如果你决定要真正推动自己的C ++知识,并测试你是否真的知道你认为自己知道什么,那么它就能提供一个有趣的挑战。我已经使用C ++十几年了,已经教过其他人如何使用它,从那时起已经熟练掌握了更多高级语言,Boost仍然让我感到惊讶。它的非常有用,但它的不是微不足道的。)

答案 1 :(得分:10)

在建议看看Boost之前,我建议明确处理STL。 Boost意味着构建在STL之上,并且许多库最终将成为标准库的一部分。 Boost库通常不如STL成熟且标准化程度低。此外,在我看来,许多boost库太过分了,添加了C ++中原生不存在的“特性”(导致语法非常疯狂)。在许多情况下,有更多理智的C ++习语可用于解决大多数编程问题,而无需使用这些神秘的Boost库。

答案 2 :(得分:5)

我认为从一开始就直接使用两者都很好。 Boost提供了许多强大的功能,被广泛使用,并且拥有良好的声誉。它提供的大部分内容都与STL设计的通用编程概念相同,因此从这个意义上说它不应该是非常混乱。

学习东西的最好方法是使用优秀的代码,然后去看看它是如何编写的。这对Boost来说非常有用。阅读模板教程,您会受到一小时内发现的新功能的启发。然后阅读你曾经使用过的Boost标题,你会受到启发数周。

当然,不要指望立即理解那些内部结构 - 起初我只是使用了这些库而不了解你将如何构建任何内容,这很好。但是在某些时候你意识到你想要用类似的设计写一些东西,然后你会去寻找。

如果你反其道而行之,并将自己局限于“C ++作为一个更安全的C”,那么你就不会接触到所有这些强大的东西,所以你不会那么容易去理解它们,所以你会写出相当原始的代码并且学得更慢。

编辑:忘了我还有另一个想法 - 看看即将推出的C ++ 0x标准。它结合了许多源自Boost的功能。也就是说,从现在开始学习C ++的学生从一开始就会使用这些概念 - 你今天也可以这样做......

答案 3 :(得分:4)

最终,你应该学习两者。但是STL可以孤立地学习,而在你理解STL之前,boost不会有多大意义,因为这就是Boost的模型,并且旨在扩展。因此,学习使用STL作为学习c ++的一部分。然后你可以继续使用Boost,这或多或少是现在的“第二标准库”。

答案 4 :(得分:2)

我会先学习STL。

一旦你完成了使用C ++的基础知识,学习如何使用STL的部分,然后学习它的工作原理将比解决Boost更好。 Boost库倾向于突破C ++的优势,特别是在高度模板化的函数组合中。

我喜欢Matt Austern的通用编程和STL ,你可以便宜地提取secondhand

答案 5 :(得分:1)

这完全取决于您是否能够在所有工作中使用Boost。我不怀疑会有工作场所禁止使用(不管看起来多么愚蠢)。

但是,如果你认为你可以在任何地方使用它,那么一定要集中精力于它。

如果STL提供的功能而不是Boost,请集中精力学习STL的这些部分。

答案 6 :(得分:1)

首先使用STL,因为这是您将在大多数时间使用的内容。掌握所有的提升是非常困难的,请检查任何无法使用c ++开箱即用的库。像解析库,图库

答案 7 :(得分:1)

通过编程学习并使用最适合的工具。如果你正在编写需要大量解析的东西,那么你可能会学习一些提升精神,但在你走到那么远之前,你也会学到关于std :: string和std :: fstream的东西。您编写的下一个应用程序可能需要std :: vectors和boost :: accumulators。

记住提升是巨大的,在你使用它的四分之一之前,你将是一个优秀的程序员(个人我不希望使用或学习大部分提升,因为我不需要它...)。

答案 8 :(得分:1)

首先学习STL。如果你从一开始就学习使用Boost的C ++,你将很难在以后的工作中使用Boost(由于许可原因等)。首先要了解语言标准,然后在以后根据某些事情需要使用Boost进行扩展。