C++类可以导出几个不同的stl样式的迭代器吗?

Cra*_*rks 1 c++ iterator stl

我有一个封装异域数据结构的类.为了这个问题,让我们说这是一个s ContainerThingy.

我们有很多地方Thingy在这个容器中迭代s,但有几种不同的方法可以这样做 - 它们可以按顺序A或B迭代,也有子集X和Y,所以有(比如)四个排列Thingys如何被迭代(子集X按顺序A,子集X按Y顺序等).

我想创建一个自定义迭代器,Container以便我可以Thingy使用C++的基于范围的语法循环.是否可以从类中导出多个不同的迭代器?显然我不能拥有

class Container { 
  ...
  iter begin();
  iter end();
}
Run Code Online (Sandbox Code Playgroud)

因为会有四种不同的iter.那么如何告诉我的基于范围的iter使用哪种?


我应该补充说,这是一个完全性能关键的上下文,所以我们不能容忍回调函数的成本.否则我会使用map(λ)类型的交易,但在这种情况下,我们正在冒汗纳秒,如果迭代器引发额外的间接函数调用(因此分支错误预测),我将不得不坚持使用我们当前的丑陋方式迭代容器.

Yak*_*ont 5

你写了一个范围.

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)}; }
Run Code Online (Sandbox Code Playgroud)

现在,您range_t将为各种迭代方法公开返回适当迭代器类型的方法.

这些可以是成员函数,也可以是无朋友函数,具体取决于您想要的语法.

迭代发生的方式可以在类型系统中进行硬编码,消除任何"回调"开销,并且range_t足够轻,应该完全优化它们.

(请注意,上面是一个精简range_t:一个真实的或许有empty,front,back,range_t without_front(size_t),甚至operator[]支持有条件如果迭代器是随机访问).