1

3つのイテレータ、、、およびit1を含むコンテナがあるとします。今、私はとを使用して範囲を定義しています。たとえば、いくつかのstdアルゴリズムに渡すためです。it2it3it1it2

とでit3定義された範囲内にあるかどうかを確認するにはどうすればよいですか?it1it2

it1私は、一時的なイテレータをからに進め、各ステップでit2チェックする強引な方法を知っています。it3もっと速い方法はありますか?

推奨されるソリューションは、ブーストなどのライブラリを使用しない標準のC++です。

編集:ìt3与えられたコンテナの同じインスタンスに作用するアプリオリは与えられません、it1そしてit2それは常にそうです。したがって、追加の質問は次のとおりです。2つのイテレータがコンテナの同じインスタンスに属していることを確認する方法はありますか?

4

4 に答える 4

4

ランダム アクセス反復子は同等です。it1 < it3 && it2 > it3それらが同じコレクションに属している場合は、そうしてください。

vectordeque、などの O(1) インデックス作成をサポートするコレクションでランダム アクセス反復子を取得しますarray

edit :インターレーターが特定のコレクションに属しているかどうかを確認することは明らかに実行可能ではなく、これはまったく別の質問です。詳細については、この質問を参照してください。(tl;dr: できません。)

于 2012-11-16T10:42:06.183 に答える
2

前方反復子の場合:

  • 1それらすべてをコンテナの最後までスクロールし、オフセットを数えます
  • 2 つの比較オフセット

ランダム アクセス イテレータの場合は、すぐに比較してください。

于 2012-11-16T10:44:27.217 に答える
2

すべてのタイプのコンテナーに対して効率的な方法はありませんが、一般的な方法は、std::distanceそのサインを使用してチェックすることです。

auto dist1 = std::distance(it1, it3); // should be 0 or +ve
auto dist2 = std::distance(it3, it2); // should be 0 or +ve

唯一の要件は、反復子がInputIterator要件を満たすことです。

いずれかの反復子が相互に到達できない場合、動作は未定義であることに注意してください。

于 2012-11-16T10:45:12.940 に答える
0

どこから来たのかわからない場合は、反復子を使用しないでください。<g>実行する比較は、反復子が範囲内を指している場合にのみ有効であるため、反復子の比較を使用してその決定を行うことはできません。

ただし、ほとんどの場合、ブルート フォースを使用できます。

while (first != last)
    if (&*first == &*questionable)
        // in sequence

これは、反復子の value_type がoperator&ファンキーな方法でオーバーロードされていないことを前提としています。

于 2012-11-16T17:03:33.863 に答える