2017-11-18 1 views
1
std::remove_copy 

template <class InputIterator, class OutputIterator, class T> 
OutputIterator remove_copy (InputIterator first, InputIterator last, 
           OutputIterator result, const T& val); 

コピー範囲除去値、ヴァルに等しいとそれらの要素 以外結果から始まる範囲の範囲 [最初、最後)にコピー要素。結果を保持するには、出力コンテナのサイズが に十分大きくなければなりません。のSTLのstd ::

q1。 なぜ出力コンテナのサイズは結果を保持するのに十分な大きさでなければなりませんか?コンテナ自体は成長していないでしょうか?

q2。 remove_copyを実行すると、出力コンテナ内の前のコンテンツが上書きされるのはなぜですか?すなわち私がremove_copy(a.begin(),a.end(),b.begin(),' ');を実行したときコンテナ内の前のコンテンツが失われ、新しいコンテンツに置き換えられます。なぜそうですか? remove_copyの結果が出力コンテナの先頭に追加されないのはなぜですか?

+0

この関数は、STLコンテナクラスおよび生の配列で機能するように設計されています。 – user0042

+2

コンテナを拡大したい場合は、['std :: back_inserter'](http://en.cppreference.com/w/cpp/iterator/back_inserter)を使用してください。 –

答えて

3

なぜ出力コンテナのサイズは、 の結果を保持するのに十分な大きさでなければなりませんか?コンテナ自体は成長していないでしょうか?

いいえどうすればよいですか?アルゴリズムにはすべてイテレータがあり、イテレータからコンテナのメンバー関数(コンテナを拡張するために必要なもの)にアクセスすることはできません。しかし、コンテナを成長させる方法を知っている特別な目的のイテレータがあります。 std::front_insert_iterator,およびstd::insert_iteratorであり、これはコンテナへの参照を保持し、逆参照および代入されるたびにそれぞれpush_front,push_backおよびinsertを呼び出す。

出力コンテナ内の以前のコンテンツは、なぜiがremove_copyを実行すると上書きされるのですか?

これは、アルゴリズムがどのように機能するかのためです。それが標準ライブラリアルゴリズムのすべての仕組みです。彼らはコンテナについて何も知らない。すべてのイテレータがコンテナから来るわけではありません。そして、すべての容器が成長可能なわけではありません。コンテナに追加する場合は、前述のようにstd::back_insert_iteratorを使用します。 std::back_inserterヘルパー関数を使用すると、テンプレートパラメータを指定しなくても簡単に作成できます。

std::remove_copy(source.begin(), source.end(), std::back_inserter(dest), value); 
0

出力コンテナのサイズが 結果を保持するのに十分な大きさでなければならない理由:たとえば?コンテナ自体は成長していないでしょうか?

のアルゴリズムが動作します。コンテナはシーケンスを作成する方法の1つですが、唯一の方法ではありません。だから、コンテナは最後にアクセスするたびに成長するように書かれているかもしれませんが、シーケンスは一般的にそうしません。

コンテナがある場合は、std::inserterを使用して、必要に応じてコンテナを展開する出力イテレータを作成できます。

出力コンテナ内の以前のコンテンツは、なぜiがremove_copyを実行すると上書きされるのですか?

出力イテレータが何であるかによって出力が異なる場合があります。コンテナ内のイテレータ(insert_iteratorではない)の場合は、すでに存在する要素にしかアクセスできないため、上書きする必要があります。出力ストリームのイテレータの場合、要素をストリームに書き込むだけです。何も上書きされません。

関連する問題