2016-10-10 10 views
0

なぜstd::reverse(c.begin(), c.end())は、基本コンテナc双方向イテレータを提供する必要があるのですか?なぜstd :: reverseは双方向イテレータを必要としますか?

事実、これは(マルチ)map、(マルチ)setを意味しますが、それらは順序付けされているため、逆もありません。唯一の他のは、双方向コンテナはlistですが、独自のメンバ関数.reverse()を持っています。

これは、1つはarrayvectorランダムアクセスあるdequestd::reverseを適用することができます。

だから、 "正直"ではなく、ランダムアクセスが必要なのか、メンバー関数を使用するのはなぜですか?

+6

これは、ユーザー定義のイテレータに対して不必要に制限されるため、 – krzaq

+0

@krzaqと思っていました。しかし、私は、出荷される潜在的なターゲットの80%に特定の機能を適用できないことは奇妙であると考えました。私は、おそらく "順序付けられた"とか何かを言うか、または直交している反復子カテゴリを発明したでしょう。 Esp。 non-applicabilityはそれらのref-pagesの 'std :: reverse'のドキュメントには言及されていないからです。おそらく仕様自体にあるでしょうか? – towi

+0

'map'または' set'を 'merge'-target(出力イテレータが必要)として使用できますか? 'map'や' set'の 'remove'はどうでしょうか?おそらく、彼らは並べ替えのために、しかし書かれているのでしょうか? – towi

答えて

2

これを行うと、二重反復イテレータを使用するユーザ定義のイテレータまたはコインセレクタで不必要に制限されます。また、ランダムアクセスは不要であるため、必須ではありません。

+1

または双方向イテレータを使用してユーザ定義のコンテナ。 – juanchopanza

3

ユーザー定義のイテレータに行く必要はなく、あなた自身の質問で答えを提供します。

のみ他二DIR容器がlistであるが、1つは、独自のメンバ関数.reverse()を有しています。

ただし、メンバー関数はリスト全体を逆にします。 std::reverseは、list.begin()list.end()以外のイテレータを渡すことで、リストの一部だけを逆転させることができます。

+0

それは良い点です。私はそれを見落としている。 – towi

関連する問題