簡體   English   中英

將 stl 算法應用於多維向量(向量<vector<t> &gt;) </vector<t>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM