我有一个封装异域数据结构的类。为了这个问题,让我们说它是Container
球的Thingy
。
我们有很多地方在这个容器中迭代Thingy
,但有几种不同的方法可以这样做 - 它们可以按顺序A或B迭代,也有子集X和Y,所以有(比方说)Thingys如何被迭代的四种排列(A中的子集X,Y中的子集X等)。
我想创建一个自定义迭代器Container
,以便我可以使用C ++基于范围的语法循环Thingy
。 是否可以从类中导出多个不同的迭代器?显然我不能只有
class Container {
...
iter begin();
iter end();
}
因为会有四种不同的iter
。 那么如何告诉我的基于范围的iter
使用哪种?
我应该补充说,这是一个完全性能关键的上下文,所以我们不能容忍回调函数的成本。否则我会使用map(λ)类型的交易,但在这种情况下,我们正在冒汗纳秒,如果迭代器引发额外的间接函数调用(因此分支错误预测),我将不得不坚持使用我们当前的丑陋方式迭代容器。
答案 0 :(得分:5)
你写了一个范围。
result2
现在,您可以为各种迭代方法公开返回适当迭代器类型的template<class It>
struct range_t {
It s, f;
It begin() const { return s; }
It end() const { return f; }
};
template<class It>
range_t<It> range( It s, It f ) { return {std::move(s), std::move(f)}; }
的方法。
这些可以是成员函数,也可以是无朋友函数,具体取决于您想要的语法。
迭代发生的方式可以在类型系统中进行硬编码,从而消除任何&#34;回调&#34;开销,range_t
足够轻,应该完全优化它们。
(请注意,以上是非常精简版range_t
:真实的range_t
,empty
,front
,{ {1}},如果迭代器是随机访问,则有条件地支持back
。