假设我们有以下嵌套循环:
MyClass myobject;
for (const std::array<int,16>& arr : myobject)
{
for (int i : arr) { /* do something with i */ }
}
其中
MyClass
例如可以迭代 16 个整数的数组。
现在,我想要一个循环来迭代
myobject
的所有数组的所有整数:
for (int i : MagicClass(myobject)) { /* do something with i */ }
其中
MagicClass
是我正在尝试设计的课程。我知道 MagicClass
应该实现返回特定迭代器的 begin/end
方法,即。像这样的东西:
class MagicClass
{
public:
MagicClass (MyClass obj) : obj_(obj) {}
struct iterator
{
// the hard part comes here...
};
iterator begin() { return iterator (obj_.begin()); }
iterator end () { return iterator (obj_.end ()); }
private:
MyClass obj_;
};
由于我正在努力获得
MagicClass::iterator
的体面实现,我想知道是否已经存在通用解决方案。
所以我的问题是:是否有任何库可以通过单个迭代器将嵌套循环(迭代其他容器的容器)转换为单个循环? 或者至少,实施的最佳实践应该是什么
MagicClass::iterator
?
std::views::join
。
#include <array>
#include <iostream>
#include <ranges>
int main()
{
std::array<std::array<int, 3>,3> arr = {{
{1,2,3},
{4,5,6},
{7,8,9},
}};
for (int x : arr | std::views::join)
std::cout << x << '\n'; // 1 2 3 4 5 6 7 8 9
}