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

问题描述 投票:0回答:1

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

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

c++ iterator nested-loops
1个回答
1
投票

这叫

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
}
© www.soinside.com 2019 - 2024. All rights reserved.