質問: data.end()) // 発見できなかった場合 break; std::cout << itr - data.begin() << "\n"; // ここです。1 //std::cout << --*itr << "\n"; ++itr; // 次の位置から検索 } reverse(data.begin(),data.end()); for (auto x : data)//ここです。2 { cout << x << " "; } //view(data); _getch(); return 0; } ```
回答: 1 は差を取っているわけです。では何の差なのか、というと、その前に * コンテナとは 複数の値を入れることができて、その要素を順番にたどることができる何か * イテレータとは 上記、コンテナで要素をたどるもの `*p` のように使うと要素を取り出せる まあ端的に、配列はコンテナの一種、配列要素へのポインタはイテレータです。 `vector` も同様コンテナで `vector::iterator` はイテレータです (`vector.begin()` はイテレータを返却します) イテレータは差を取ることができます。提示コードはこのイテレータの差=どれだけ離れているかを計算しています。同じ配列の別の要素を指すポインタとポインタの差を取ると、要素がどれだけ離れているかになるのと同じですね。 でも本来このコードはダメです。イテレータの差は `std::distance` で取るべきです。 リンク先のいう * 「ランダムアクセスイテレータ」は `vector` や単純配列などの場合で、このとき「差」は単純に減算一発で取れてしまいます(なので O(1) 定数時間で算出可能) * 「それ以外」は例えば `list` の場合で、 `list` の要素がどれだけ離れているかは1つづつ要素を追いかけていく必要があります。なので O(n) 。この理解は宿題にしときましょう。 2 は「範囲 `for` 」と呼ばれるもので リンク先解説にもありますが `begin()` から `end()` までループする処理は定番なので簡単に書けるようにしました というものです。