将 stl 算法应用于多维向量 (vector<vector<T> >)
Posted
技术标签:
【中文标题】将 stl 算法应用于多维向量 (vector<vector<T> >)【英文标题】:Applying stl algorithms to multidimensional vectors (vector<vector<T> >) 【发布时间】:2021-01-07 06:14:33 【问题描述】:一般来说,stl
算法如何应用于多维向量(即vector<vector<T> >
)?
例如,如果我想根据某个函数myFunc()
填充某个向量myVector
,我可能会使用类似的东西:
std::generate(myVector.begin() myVector.end(), myFunc())
现在假设myVec
是vector<vector<T> >
。我如何使用std::generate
根据myFunc
填充myVec
中每个向量的每个元素?我需要使用循环(排除所有其他考虑)吗?
我可以简单地写一些类似的东西:
std::generate(myVec.begin(), myVec.end(), std::generate(...))
令人惊讶的是,我在这里或其他地方找不到任何关于此的内容。
【问题讨论】:
【参考方案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
调用,因为它不需要当前元素来知道每个内部向量的大小。
【讨论】:
以上是关于将 stl 算法应用于多维向量 (vector<vector<T> >)的主要内容,如果未能解决你的问题,请参考以下文章