次のようなポインターの両端キューを定義しました。
std::deque<BoardSquare *> mydeque;
両端キューで範囲ベースの for ループを使用したいと思います。
for (BoardSquare * b : mydeque) {
// do something involving the index of b
}
範囲ベースのforループ内からアイテムのインデックスを取得することは可能ですか?
範囲ベースのループで使用される (アクセスできない) イテレータを複製して、インデックスを追跡するために追加の変数を追加する必要があります。continue
誰かがループにステートメントを追加した場合に問題が発生しないように特に注意して、反復ごとに正しく初期化およびインクリメントされていることを確認する必要があります。
for
インデックス (または、必要に応じてインデックスを計算できる反復子) を従来のループの反復変数として使用する方が簡単で、エラーが発生しにくくなります。
ループ インデックスを取得するための推奨されるアプローチを示す @ChristianRau による優れた回答に加えて、範囲指定された for ループからインデックスを取得する方法がありますが、std::vector
それは要素を保証する唯一のコンテナーであるため、 a を使用する場合のみです。記憶の連続。
#include <deque>
#include <vector>
#include <iostream>
int main()
{
auto v = std::vector<int> { 0, 1, 2, 3 };
auto d = std::vector<int*> { &v[0], &v[1], &v[2], &v[3] }; // NOT: std::deque
for (auto ptr: d)
{
// assumes element contiguity, only guaranteed for std::vector!!
auto const i = std::distance(&d[0], &ptr);
std::cout << *(d[i]) << "\n";
}
}
ライブ出力は でクラッシュしstd::deque
ます。