在过去的 6 年里,我几乎完全是一名 C# 程序员。我现在正在做一个项目,其中 C++ 是首选语言,STL 是我们的集合库。
在使用 C# 的 LINQ 之后,我很难进入 STL 的思维框架。
例如:编写一个等效的 IEnumerator.Select。
C#
public static IEnumerator<Output> Select(this IEnumerator<Input> input, Func<Input, Output> func) {
while (input.MoveNext) {
yield return func(input.Current);
}
}
超级容易。
现在尝试用 C++ 和 STL 编写类似的东西。(撇开 yield 关键字和匿名函数的方便语法问题)。
如果不首先回答一些困难的问题,它甚至无法完成。因为 STL 枚举器使用枚举器间比较而不是 MoveNext,所以您必须确定枚举器的终端值是什么。然后你必须搞砸所有的 iterator_traits 废话。STL 使用编译时模板分派而不是运行时动态分派,因此您的迭代器不仅必须在输入枚举器的 value_type 上进行模板化,而且还必须在特定类型的输入枚举器上进行模板化。
甚至不要让我开始尝试在 STL 中编写 map-join 迭代器。
通过查看其他人编写的代码,我得出结论,未使用 Boost 增强的 STL 很少用于集合和排序以外的任何事情。
我最近的观察是:
- 有没有办法在 STL 中简洁地编写突变迭代器?
- 你如何简洁地将一个集合复制到另一个集合中?
更一般地说,我注意到一些与我习惯的思维方式相冲突的事情:
- STL 代码似乎并不简洁。在编写 STL 代码时,我编写简洁代码的目标是一种责任吗?(不简洁,我的意思是,通常涉及很长的类型标识符)
- Boost 似乎是在 STL 中编写算法的近乎要求。不允许使用 Boost 的人会做什么?