gpt4 book ai didi

c++ - 一个 C++ 类可以导出多个不同的 STL 样式迭代器吗?

转载 作者:行者123 更新时间:2023-11-30 01:08:28 25 4
gpt4 key购买 nike

我有一个封装了奇异数据结构的类。对于这个问题,我们假设它是 Thingy 球的 Container

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

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

class Container { 
...
iter begin();
iter end();
}

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


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

最佳答案

你写一个范围。

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)}; }

现在您公开返回 range_t 的方法,适合您的各种迭代方式。

这些可以是成员函数,也可以是友元自由函数,具体取决于您需要的语法。

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

(请注意,上面是非常精简的range_t:真实的可能有emptyfrontbackrange_t without_front(size_t),甚至 operator[] 如果迭代器是随机访问,则有条件地支持。

关于c++ - 一个 C++ 类可以导出多个不同的 STL 样式迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com