问题描述
我正在使用基于范围的vector<vector<float> >
循环遍历多维for
。所以,像这样:
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)
{
}
}