【问题标题】:Moving a range-based iterator forward from within the loop从循环内向前移动基于范围的迭代器
【发布时间】:2020-10-29 19:16:28
【问题描述】:

我正在使用基于范围的 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 循环打印整个范围。您要么需要不同类型的循环,要么需要范围适配器。
  • 另外,将您的数据存储在单维向量中,这具有更好的缓存性能,并且会显示出真正的加速。

标签: c++ arrays loops for-loop vector


【解决方案1】:

缺少一些上下文,所以我只是盲目地相信你写的东西:你知道如何使用基于迭代器的循环来做你的特殊增量:

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

问题是,基于范围的循环并不神奇。对于每个基于范围的循环,都有一个完全等效的传统循环。基于范围的循环从 直到 和 not 进行迭代,授予您访问索引或迭代器的权限是它们如此吸引人的原因。如果您确实需要索引,请使用其他东西。

同样的// 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

【讨论】:

    【解决方案2】:

    尝试 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)
        {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2011-10-20
      • 2015-04-30
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多