迭代多个嵌套向量

Iterate multiple nested vectors

本文关键字:向量 嵌套 迭代      更新时间:2023-10-16

假设有一个类a的向量具有一些特定的属性。其中,它有一个类型为B的向量。此外,B还有一个类型为vector的成员变量。迭代所有给定c的最好方法是什么?

简单的方法是使用嵌套循环。将C类型对象的属性foo更改为禁止诸如

之类的内容
for (i=0; i<as.size(); i++)
  for (j=0; j<as[i].bs.size(); j++)
    for (k=0; k< as[i].bs[j].cs.size(); k++)
      as[i].bs[j].cs[k].foo = bar

如果我必须以这种方式迭代C类的所有对象;也许有一个更复杂的身体;代码变得相当混乱。除了额外的标识之外,这些嵌套的for循环构造在代码中重复。

是否有更优雅的方法来做到这一点?我可以声明某种迭代器来做这个吗?我不得不使用c++ 98

  • 你可以做一个功能:

    template <typename T, typename F>
    void my_for_each(std::vector<std::vector<std::vector<T>>>& v, F f)
    {
        for (std::size_t i = 0; i != as.size(); i++)
            for (std::size_t j = 0; j != as[i].bs.size(); j++)
                for (std::size_t k = 0; k != as[i].bs[j].cs.size(); k++)
                    f(as[i].bs[j].cs[k].foo);
                }
            }
        }
    }
    

    要求函子使用它:

    struct bar_assigner
    {
        bar_assigner(int bar) : bar(bar) {}
        operator () (int& e) const { e = bar; }
        int bar;
    }
    

    一样使用
    my_for_each(as, bar_assigner(bar));
    
  • 另一种选择是平坦你的数组(如果每个内部向量有相同的大小):

    class Matrix3
    {
        public:
            typedef std::vector<int>::iterator iterator;
            Matrix3(std::size_t a_size, std::size_t b_size, std::::size_t c_size) :
            a_size(a_size), b_size(b_size), c_size(c_size), v(a_size * b_size * c_size){}
            int& operator()(std::size_t i, std::size_t j, std::size_t k)
            { return b_size * c_size * i + c_size * j + k; }
            iterator begin() { return v.begin(); }
            iterator end() { return v.end(); }
            // ...
        private:
            std::size_t a_size;
            std::size_t b_size;
            std::size_t c_size;
            std::vector<int> v;
    };
    

    和用法:

    for (Matrix3::iterator it = m.begin(); it != m.end(); ++it) {
        *it = bar;
    }
    

  • 第三种选择是创建自己的迭代器:

    class Iterator3D
    {
    public:
        Iterator3D& operator ++() {/*..*/}
        int& operator *() {/*..*/}
        int* operator ->() { return &this->operator *(); }
        operator ==(const Iterator3D& rhs) const {/*..*/}
    private:
        std::vector<std::vector<std::vector<int>>>& v;
        std::size_t index_a;
        std::size_t index_b;
        std::size_t index_c;
    };
    

    和用法:

    for (Iterator3D it = my_begin(as); it != as_end(as); ++it) {
        *it = bar;
    }