[英]Applying stl algorithms to multidimensional vectors (vector<vector<T> >)
通常,如何將stl
算法應用於多維向量(即vector<vector<T> >
)?
例如,如果我想根據一些 function, 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(...))
令人驚訝的是,我在這里或其他地方找不到任何關於此的內容。
傳遞給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
調用,因為它不需要當前元素來知道每個內部向量的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.