【发布时间】:2013-05-21 06:30:58
【问题描述】:
考虑像join_iterator 这样的输入迭代器:它迭代其他范围的串联。重复调用++i 可能比简单的i += n 慢很多。
尽管如此,大多数需要将迭代器推进任意数量的 C++ 代码都使用 std::advance,当迭代器不是随机访问时,它会自动调用 ++i。
(遗憾的是,大多数人使用std::advance(i, n) 而不是using std::advance; advance(i, n),所以我不能只为我的迭代器提供advance 并依赖ADL。)
另一方面,我不能使用+ 或+=,因为输入迭代器不必实现它们。
所以问题是:我将如何支持这样的场景,什么时候:
实现这样的迭代器?
使用可能具有优化的
operator +=的输入迭代器?
(请注意,advance 和 + 并不是唯一重要的场景——distance 和 - 也有同样的问题。)
【问题讨论】:
-
@MichaelAaronSafyan:嗯,是因为大家好像都用
std::advance而不是advance,所以就算我提供了,也不会实际使用。 -
@MichaelAaronSafyan:是的,我确实需要这种快速迭代。 (是的,我实际上知道
++is 太慢了。)我自己也遇到过both 的情况——自己编写迭代器,以及编写将从这种优化的迭代器中受益的算法。我想知道如何正确处理 both 情况:即如何provide 和consume 这样的迭代器。 -
@Mehrdad 没错,但我们会专门化一个模板,而不是重载一个函数(我认为)。参照。 stackoverflow.com/a/14403772/777186
-
@jogojapan:啊,部分函数特化虽然适用于 C++11,但大多数迭代器都是模板化的,因此它们需要部分特化而不是完全特化,对吧?我会对 C++03 做什么?
-
@Mehrdad 你是对的。我的解决方案只有在您对两个模板参数都专门化
std::advance时才有效,即明确专门化它。这不好,因为您不能(或不想)预期第二个参数的所有可能整数类型。