是否有可能有一個 for 回圈,它從一個范圍的中間開始,然后回圈到該范圍的開頭并繼續直到它遍歷整個范圍?例如,假設我們的范圍是 0 到 63,我希望回圈從 22 開始,繼續回圈直到達到 63,然后從 0 開始回圈直到達到 21。這可以用 for 回圈嗎?或者我需要一個while回圈?
uj5u.com熱心網友回復:
我會使用兩個回圈變數:一個用于計算重復次數,另一個用于處理所需的索引。像這樣:
for (int i = 0, j = 22; i < 64; i, j = (j 1) % 64)
// do something with j
當然,在實際代碼中,您會用更清楚地反映所涉及的實際物件的東西來替換幻數 (22, 64)。
uj5u.com熱心網友回復:
是的,您可以for為此使用基于范圍的回圈。C 20 STL 示例(帶有using namespace std::ranges):
constexpr void foo(auto&& range) {
auto middle = range.begin() 22;
auto parts = {subrange{middle, range.end()}, subrange{range.begin(), middle}};
for (auto&& elem: parts | views::join) bar(elem);
}
也許有更好看的方式/圖書館。使用適當的 API,它應該類似于
constexpr void foo(auto&& range) {
for (auto&& elem: range | drop(22) | chain(range | take(22))) bar(elem);
}
編輯:幾乎相同的“適當的 API”可以在(這是我想象的“不可管道化”版本)中找到:ranges::v3::viewconcatchain
constexpr void foo(auto&& range) {
for (auto&& elem: concat(range | drop(22), range | take(22))) bar(elem);
}
uj5u.com熱心網友回復:
是的,例如:
for( int i = 22, max = 63, end = i-1 ; i!=-1 ; i=i==end?-1:i==max?0:i 1 )
{
// do something with i
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347912.html
上一篇:錯誤的回圈結果
