展开讨论

经验与复盘经验摘录 · 机器翻译

那么,除了另一条回复中已经提到的整个术语争论之外,还有几点要说:1

那么,除了另一条回复中已经提到的整个术语争论之外,还有几点要说:1. Stepanov 的泛型编程是一个好主意。你所见过的任何带有“泛型”的语言,都是他的想法,至少“STL”是泛型编程,大家一致认为这是一个好主意。2. 但 STL 现在已经很老了,所以虽然这个想法很好,但这是最早(Stepanov 在 C++ 之前就尝试过在其他语言中实现)的实现之一,因此其他实现往往更好,因为它们从经验中学习。3. 除了相当不错的泛型算法,STL 还提供了很多容器类型(Rust 中称为集合类型),这些类型之间的差异不是在“优秀”和“一般”之间,而是在“一般”和“难以理解的可怕”之间。最善意的解释是,它们只是用于教学。如果你在计算机科学课程中教授数据结构与算法,你希望用“外向的双向链表”来教学。但如果你在编写软件,你几乎肯定不需要这种类型,但它却在 C++ STL 中随处可见。

源讨论C++:纪录片今日发布原帖 317 条评论 · 导入时统计
3

这条内容在回应什么?

父级讨论 · 节选

LE

C++ 标准模板库是 C++ 库中设计最好的部分。它是由亚历山大·斯特潘诺夫设计的。 https://en.wikipedia.org/wiki/Alexander_Stepanov

完整原文

社区评论 0

还没有社区评论,来聊聊你的看法。

原讨论中的回复 3

仅展示本次导入中包含的直接回复。中文为机器翻译,可查看英文原文。

EI

> 有一种 "我想我会用这个" 的容器类型,就是 std::vector。 关于这个类型……我认为在大多数使用 std::Vector 的情况下,作者真正想要的是一种类似类型,但其大小和容量在构造时就固定且不再改变。标准 C++ 库并没有提供这种类型——所以人们用 vector 是因为它很方便。 我同意你对大多数容器的看法。我也讨厌选项类型(optionals)从未与容器一起使用,因为它们被标准化得比较晚(而且即使如此,对于引用的问题也处理得不太好)。因此,例如,如果我在一个 T 类型的 map 中查找一个对象,我认为结果应该是对 T 的可选引用。

完整原文
BE

我认为就连 STL 的基本概念也是错误的。我经常看到的论点是“你只需要 N 个算法来处理 M 种容器类型,而不是 N*M 个”。这忽略了算法和数据结构之间并不是相互独立的,而且现在大多数时候你操作的都是 vectors,所以 M ≈ 1。 例子:list::sort。你不会想在链表上运行快速排序。或者 remove_if:我们已经抽象了删除而不擦除的困难任务,但无法在 maps 上使用。(C++20 似乎添加了 erase_if,显然承认了两步的 remove/erase 是愚蠢的)。 还有 C++ 迭代器基本上是数据结构中的指针,对于 vectors(你常用的类型)来说,使用索引/容器对会更好,这样在稳定性和边界检查方面都更优。

完整原文
AH

据我所知,std::map 对它本身来说也是可以的:一个有序的、基于节点(树)的 map。这些几乎总是比哈希表慢。当然,std::unordered_map,也就是标准的哈希表,因为一些不必要的错误而表现糟糕。对于这个,有 boost::unordered_flat_map。

完整原文
在 Hacker News 阅读

尊重不同观点,分享具体经验。

登录后即可发帖、评论、转发和引用。