gpt4 book ai didi

c++ - STL有什么了不起的?

转载 作者:IT老高 更新时间:2023-10-28 12:42:03 25 4
gpt4 key购买 nike

我是一名尝试学习 C++ 的 Java 开发人员。我多次在互联网上(包括 Stack Overflow)读到 STL 是您可以在任何语言中获得的最好的集合库。 (对不起,我没有任何引用)

但是,在学习了一些 STL 之后,我真的看不出是什么让 STL 如此特别。您能否介绍一下 STL 与其他语言的集合库的不同之处,并使其成为最好的 集合库?

最佳答案

STL 有什么了不起的地方?

STL 的伟大之处在于它很早就被构想出来,并且成功地非常有效地使用了 C++ 泛型编程范式。

它有效地分离了数据结构:vector, map, ... 以及对它们进行操作的算法copy, 转换,...利用模板来做到这一点。

它巧妙地解耦了关注点,并提供了带有自定义钩子(Hook)的通用容器(ComparatorAllocator 模板参数)。

结果非常优雅(DRY 原则)并且由于编译器优化而非常高效,因此给定容器的手动生成算法不太可能做得更好。

这也意味着它易于扩展:您可以使用您希望的接口(interface)创建自己的容器,只要它公开符合 STL 的迭代器,您就可以使用 STL 算法!

并且由于使用了特征,您甚至可以通过普通指针将算法应用于 C 数组!谈论向后兼容性!

但是,它可能(也许)会更好......

STL 有什么不好的地方?

我真的很生气,总是要使用迭代器,我真的支持能够写: std::foreach(myVector, [](int x) { return x+1; }); 因为面对现实,大多数时候你想遍历整个容器......

但更糟糕的是,正因为如此:

set<int> mySet = /**/;

set<int>::const_iterator it = std::find(mySet.begin(), mySet.end(), 1005); // [1]
set<int>::const_iterator it = mySet.find(1005); // [2]

[1][2] 的执行方式完全不同,导致 [1] 复杂度为 O(n) 而 [2] 的复杂度为 O(log n)!这里的问题是迭代器抽象太多了。

我并不是说迭代器不值得,我只是说在迭代器方面独占提供接口(interface)是一个糟糕的选择。

我更喜欢 View 而不是容器,例如看看 Boost.MPL 做了什么.使用 View ,您可以使用(惰性)转换层来操作容器。它提供了非常有效的结构,允许您过滤掉一些元素,转换其他元素等......

结合 View 概念检查的想法,我认为,会为STL算法产生一个更好的界面(并解决这个findlower_boundupper_boundequal_range 问题)。

它还可以避免使用定义不明确的迭代器范围以及由此导致的未定义行为的常见错误...

关于c++ - STL有什么了不起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2824508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com