いう、とても古いバージョンのものです。3年ごとに更新されます)。機能強化は強力なものです。古いバージョンを対象にする意味はありません。ベースにした新C++編を始めました。この章の概要この章の概要です。STLアルゴリズムこの章では、STLアルゴリズムの中から、対象の要素を削除するものを取り上げます。STLアルゴリズムにおいて、「削除」とは論理的なものであることを注意してください。実際に要素の個数が減るわけではなく、削除されなかった後続の要素によって「上書き」されているだけです。削除後の新しい有効範囲の末尾を返して、そこより後ろの要素を使わせないことで実現しています。新しく末尾になった位置よりも後ろに何があるかは実装依存です。STLアルゴリズムは、連想コンテナに対しては使用できません。removeremove関数は、指定の範囲内の要素のうち、指定の値と一致する要素をすべて削除します。value);}第1、2引数が対象の範囲を表し、第3引数で指定した値と一致する要素を削除します。戻り値は、削除を行った後の、新たな末尾(削除されなかった最後の要素の次)を指すイテレータです。remove関数(第6章)を使った方が効率的です。remove関数とは挙動が異なります。STLアルゴリズムは、実際には要素を削除していません。そのため、戻り値で返されるイテレータを受け取って、それを新たな「末尾」とするようにしてください。endメンバ関数の結果を使うと、削除したはずの要素が登場してしまいます。実際には要素が削除されていないため、sizeメンバ関数が返す結果も変化しないことに注意してください。remove関数を使い、本当に要素を削除したい場合には、追加処理が必要になります。removeメンバ関数がありますから、そちらを使えば済みます。remove関数は使えません。代わりに、eraseメンバ関数があるので、これを使うことになります。その他のコンテナでは、eraseメンバ関数と組み合わせる必要があります。eraseメンバ関数があります(第4章)。std::remove関数が返した新しい「末尾」を指すイテレータと、endメンバ関数で取得した古い「末尾」を指すイテレータを渡すことで、削除されるべき要素を本当に取り除くことができます。remove_ifremove_if関数は、指定の範囲内の要素のうち、指定の条件を満たす要素をすべて削除します。pred);}第1、2引数が対象の範囲を表し、第3引数の単項叙述関数で削除の条件を指定します。返す要素すべてが削除されます。戻り値は、削除を行った後の、新たな末尾(削除されなかった最後の要素の次)を指すイテレータです。remove_if関数(第6章)を使った方が効率的です。remove_if関数とは挙動が異なります。Println);}実行結果113-------11313本当に要素を取り除きたいときの方法は、remove関数と同様なので省略します。remove_copyremove_copy関数は、指定の範囲内の要素のうち、指定の値と一致する要素をすべて省き、残りの要素をもう1つの範囲へコピーします。copy関数(第20章)が組み合わされたものです。value);}第1、2引数がコピー元の範囲、第3引数がコピー先の範囲の先頭です。第4引数の値と一致する要素についてはコピー対象から省かれます。戻り値は、最後にコピーされた要素の次を指すイテレータです。copy関数と同様に、コピー先に十分な領域があることが前提になることに注意してください。挿入イテレータ(第25章)の使用を検討するのも良いでしょう。Println);}実行結果023remove_copy_ifremove_copy_if関数は、指定の範囲内の要素のうち、指定の条件を満たす要素をすべて省き、残りの要素をもう1つの範囲へコピーします。copy関数(第20章)が組み合わされたものです。pred);}第1、2引数がコピー元の範囲、第3引数がコピー先の範囲の先頭です。第4引数の単項叙述関数で削除の条件を指定します。返す要素すべてがコピー対象から省かれます。戻り値は、最後にコピーされた要素の次を指すイテレータです。remove_copy関数などと同じく、コピー先に十分な領域があることが前提になることに注意してください。Println);}実行結果113uniqueunique関数は、指定した範囲内に、連続して同じ値の要素(または条件を満たす要素)があったとき、後ろ側の要素を削除することで、重複を取り除きます。pred);}remove関数と同様に、実際には要素は削除されません。第1、2引数が対象の範囲になります。戻り値は、削除を行った後の、新たな末尾(削除されなかった最後の要素の次)を指すイテレータです。2つ目の形式の場合には、第3引数に、二項叙述関数を指定します。