[英]Moving a range-based iterator forward from within the loop
我正在使用基於范圍的for
循環迭代多維vector<vector<float> >
。 所以,像這樣:
for(vector<float> &row : myVector){
// Do some stuff
}
我希望能夠根據循環內的條件向前移動一些固定數量的n
行。 當然,我可以執行以下操作:
for(int i = 0, j = 0; i < rows && j < columns; ++i, ++j){
// Do some stuff
}
但是,使用基於范圍的循環對於循環中包含的算法非常有利,如果可能的話,我更願意保留它。 這是可能的,如果是,如何?
缺少一些上下文,所以我會盲目地相信你寫的東西:你知道如何使用基於迭代器的循環來做你的特殊增量:
for(int i = 0, j = 0; i < rows && j < columns; ++i, ++j){
// Do stuff
}
但你也有一個基於范圍的循環:
for(vector<float> &row : myVector){
// Do some stuff
}
你不想改變// Do some stuff
。
問題是,基於范圍的循環並不是魔術。 對於每個基於范圍的循環,都有一個完全等效的傳統循環。 基於范圍的循環從直到和不授予您訪問索引或迭代器的權限使它們如此有吸引力。 如果您確實需要索引,請使用其他東西。
你同樣的// Do some stuff
可以在基於迭代器的循環中不變地使用:
for(auto it = myVector.begin(); it != myVector.end(); ++it) {
auto& row = *it;
// Do some stuff
// Do your special increment stuff with it
}
注意這個// Do some stuff
可以和上面基於范圍的 for 循環完全一樣。
有關如何將基於范圍的 for 循環編寫為帶有迭代器的循環的更多詳細信息,請參閱cppreference 。
試試 boost::range 或 std::ranges。 這就是帶有 boost::range 的代碼的樣子。
auto nRows = myVector | boost::adaptors::sliced(0, rows);
for(auto& row : nRows)
{
auto nVals = row | boost::adaptors::sliced(0, cols);
for(auto& val : nVals)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.