簡體   English   中英

從循環內向前移動基於范圍的迭代器

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

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