3

次のようなポインターの両端キューを定義しました。

std::deque<BoardSquare *> mydeque;

両端キューで範囲ベースの for ループを使用したいと思います。

for (BoardSquare * b : mydeque) {

    // do something involving the index of b
}

範囲ベースのforループ内からアイテムのインデックスを取得することは可能ですか?

4

4 に答える 4

3

範囲ベースのループで使用される (アクセスできない) イテレータを複製して、インデックスを追跡するために追加の変数を追加する必要があります。continue誰かがループにステートメントを追加した場合に問題が発生しないように特に注意して、反復ごとに正しく初期化およびインクリメントされていることを確認する必要があります。

forインデックス (または、必要に応じてインデックスを計算できる反復子) を従来のループの反復変数として使用する方が簡単で、エラーが発生しにくくなります。

于 2013-07-19T15:45:55.623 に答える
2

ループ インデックスを取得するための推奨されるアプローチを示す @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ます。

于 2013-07-19T18:44:27.397 に答える