使用迭代器将 C++ 嵌套循环转换为单个循环

edr*_*zen 6 c++ iterator nested-loops

假设我们有以下嵌套循环:

MyClass myobject;

for (const std::array<int,16>& arr : myobject)
{
    for (int i : arr)  {  /* do something with i */  }
}
Run Code Online (Sandbox Code Playgroud)

例如, whereMyClass可以迭代 16 个整数的数组。

现在,我想要一个循环来迭代所有数组的所有整数myobject

for (int i : MagicClass(myobject))  {  /* do something with i */  }
Run Code Online (Sandbox Code Playgroud)

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

由于我正在努力获得一个像样的实现MagicClass::iterator,我想知道是否已经存在通用的解决方案。

是否有任何库可以通过单个迭代器将嵌套循环(迭代其他容器的容器)转换为单个循环?或者至少,实施的最佳实践应该是什么MagicClass::iterator

Hol*_*Cat 12

它被称为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
}
Run Code Online (Sandbox Code Playgroud)