【问题标题】:Applying stl algorithms to multidimensional vectors (vector<vector<T> >)将 stl 算法应用于多维向量 (vector<vector<T> >)
【发布时间】:2021-01-07 06:14:33
【问题描述】:

一般来说,stl 算法如何应用于多维向量(即vector&lt;vector&lt;T&gt; &gt;)?


例如,如果我想根据某个函数myFunc() 填充某个向量myVector,我可能会使用类似的东西:

std::generate(myVector.begin() myVector.end(), myFunc())

现在假设myVecvector&lt;vector&lt;T&gt; &gt;。我如何使用std::generate 根据myFunc 填充myVec 中每个向量的每个元素?我需要使用循环(排除所有其他考虑)吗?

我可以简单地写一些类似的东西:

std::generate(myVec.begin(), myVec.end(), std::generate(...))

令人惊讶的是,我在这里或其他地方找不到任何关于此的内容。

【问题讨论】:

    标签: c++ vector stl


    【解决方案1】:

    传递给std::generate() 的生成器需要返回一个可分配给容器元素类型的类型。所以,在你的例子中,myVector 的元素类型是另一个vector,所以myFunc() 需要返回一个完整的vector,例如:

    template<typename T>
    vector<T> myFunc()
    {
        vector<T> v;
        // populate v as needed...
        return v;
    }
    
    vector<vector<T> > myVector(some size);
    std::generate(myVector.begin() myVector.end(), myFunc<T>);
    

    否则,您将不得不做更多类似的事情:

    template<typename T>
    void myFunc(vector<T> &v)
    {
        // populate v as needed...
    }
    
    vector<vector<T>> myVector(some size);
    for(auto &v : myVector) {
        myFunc(v);
    }
    

    【讨论】:

      【解决方案2】:

      使用范围库(如range-v3),您可以展平向量以使用较小维度的向量:

      std::vector<std::vector<int>> v(4, std::vector<int>(3));
      
      auto flattened = v | ranges::view::join;
      
      std::generate(begin(flattened), end(flattened), [n = 0]() mutable{ return n++; });
      

      Demo

      否则,常规循环似乎更简单:

      auto gen = [n = 0]() mutable{ return n++; }
      for (auto& inner : v) {
          std::generate(begin(inner), end(inner), gen);
      }
      

      你不能真正嵌套 generate 调用,因为它不需要当前元素来知道每个内部向量的大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多