简体   繁体   English

将 stl 算法应用于多维向量(向量<vector<t> &gt;) </vector<t>

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

How, generally, can an stl algorithm be applied to a multidimensional vector (ie a vector<vector<T> > )?通常,如何将stl算法应用于多维向量(即vector<vector<T> > )?


For example, if I wanted to fill some vector, myVector , with values according to some function, myFunc() , I might use something like:例如,如果我想根据一些 function, myFunc()填充一些向量myVector ,我可能会使用类似:

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

Suppose now that myVec is a vector<vector<T> > .现在假设myVec是一个vector<vector<T> > How might I use std::generate to populate every element of every vector in myVec according to myFunc ?我如何使用std::generate根据myFunc填充myVec中每个向量的每个元素? Need I use a loop (barring all other considerations)?我需要使用循环(排除所有其他考虑)吗?

Would I simply write something like:我会简单地写一些类似的东西:

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

Surprisingly, I cannot find anything on this here or elsewhere.令人惊讶的是,我在这里或其他地方找不到任何关于此的内容。

The generator passed to std::generate() needs to return a type that is assignable to the element type of the container.传递给std::generate()的生成器需要返回一个可分配给容器元素类型的类型。 So, in your example, the element type of myVector is another vector , so myFunc() would need to return a whole vector , eg:因此,在您的示例中, 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>);

Otherwise, you will have to do something more like this instead:否则,您将不得不做更多类似的事情:

template<typename T>
void myFunc(vector<T> &v)
{
    // populate v as needed...
}

vector<vector<T>> myVector(some size);
for(auto &v : myVector) {
    myFunc(v);
}

With range library (as range-v3 ), you might flatten your vectors to work with vector of less dimension:使用范围库(如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演示

Else, regular loop seems the simpler:否则,常规循环似乎更简单:

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

You cannot really nest generate calls as it doesn't take current element to know size of each inner vector.您不能真正嵌套generate调用,因为它不需要当前元素来知道每个内部向量的大小。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM