繁体   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