将 stl 算法应用于多维向量(向量<向量<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()的生成器需要返回一个可分配给容器的元素类型的类型。因此,在您的示例中,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);
}

使用范围库(如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++; });

演示

除此之外,常规循环似乎更简单:

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

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

最新更新