【发布时间】:2011-06-01 07:28:18
【问题描述】:
我对 stl 迭代器的笨拙感到沮丧,我正在寻找更有用的东西。特别是一个更容易映射和过滤的概念,也更容易实现:基本上是 C#/python/ruby/everything-but-C++ 风格的枚举。
我看到了 Andrei Alexandrescu 在 2009 年的 Iterator's must go! boostcon 主题演讲,他在其中描述了一个范围概念,这几乎正是我正在寻找的东西,甚至更多。
有人知道这样的事情是否真的实现了吗?我知道 boost::range,但这不是一个理想的解决方案;它是根据迭代器实现的(这更令人困惑和复杂,效率更低,通用性更低,并且使编写自己的迭代器至少与实现迭代器一样混乱)。不过,总比没有好。还有什么更好的吗?
编辑:关于为什么这很有吸引力的讨论很多。 On iteration 更清楚地解释了动机。我意识到与 D 的链接——但这不应该分散争论本身的注意力。
【问题讨论】:
-
我建议你对安德烈的演讲多加怀疑,他有自己的动机。我同意他提出了一些好的观点,但斯捷潘诺夫也有他的好观点。范围并不总是直观的。您关于提升范围的大多数声明都是没有根据的。另请记住,您无法对复杂的世界进行建模。
-
@ybungalobill:也许吧,但我已经厌倦了迭代器,可以尝试一下。而 boost::range 真的不完全是(我不知道你所说的 unbased 是什么意思):它需要你实现迭代器,从而维护 both 迭代器 and 的代码i> 范围 - 我正在寻找更简单的东西,而不是更复杂的东西。最后,许多其他语言已经成功地使用了类似范围的概念这一事实很好地暗示了这并不是一些遥远的不切实际的概念。我正在寻找 C++ 枚举器(不是迭代器),andrei 提出了更好的东西:有什么不喜欢的?
-
@Eamon,为什么范围会比迭代器更简单?即使您不将它们实现为 2 个迭代器,它们基本上仍然是 2 个 const 迭代器。在某些情况下,它们可能更方便使用,但是为什么它们的非迭代器实现会比基于迭代器的更简单?
-
我不同意你们所有人的观点:迭代器是灵活的。
-
@Eamon Nerbonne:迭代器转换(过滤、用函数组合、获取指向结果的成员指针......)和“特殊”输出迭代器(除了最后一个你给他们的东西之外,它会忘记所有的东西) ,或存储修改/过滤的版本)正是使它们变得灵活的原因。 不灵活的是标准的迭代器类:即。无法区分右值/左值迭代器。我找到了一个 C++0x 提案来解决这个问题。借助 auto 和 lambda,它们是使用运行时高效的表达函数构造来增强 C++ 的绝佳工具。
标签: c++ boost stl iterator range