将 stl 算法应用于多维向量 (vector<vector<T> >)

Applying stl algorithms to multidimensional vectors (vector<vector<T> >)

通常如何将 stl 算法应用于多维向量(即 vector<vector<T> >)?


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

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

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

我会简单地写这样的东西吗:

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

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

传递给 std::generate() 的生成器需要 return 一个可分配给容器元素类型的类型。因此,在您的示例中,myVector 的元素类型是另一个 vector,因此 myFunc() 需要 return 整个 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);
}

使用范围库(如 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 调用,因为它不需要当前元素就知道每个内部向量的大小。