C++ remove_if()

3697 ワード

remove_if(begin,end,p)begin,end:コンテナの範囲反復器で、この範囲内でp:述語パラメータを除去することを示し、remove_if述語パラメータがtrueの要素が除去されます
起源
<>11章11.4を練習しstringの句読点を削除します.
構想
汎用アルゴリズムのremove_を使用するif()を削除します.
while (cin >> word)
{
	for (auto &ch : word) ch = tolower(ch);
	// ispunct                
	remove_if(word.begin(), word.end(), ispunct);
}

上記のコードを実行すると、元のstringが句読点を削除していないことがわかります.例えばZerLinと入力すると、出力結果はZerlin.で、結果Zerlinを望みます.その後、ブログをめくってみると、
remove_if()は、トリミングされたシーケンスを指す最後の要素反復器を返します.remove_if()はシーケンス[start,end)の要素を実際に除去するわけではありません.すべての要素は容器の中にあります.実際にはremove_if()除去すべきすべての要素をコンテナの尾に移動し、境界の反復器を返します.除去されたすべての要素は、返された反復器でアクセスできます.実際に要素を除去するには、容器に対してerase()を呼び出して、除去する要素を消去する必要があります.
<>の言葉を思い出す.
標準ライブラリアルゴリズムは、コンテナではなく反復器を操作します.したがって、アルゴリズムは要素を追加または削除することはできません.
コードの変更:
while (cin >> word)
{
	for (auto &ch : word) ch = tolower(ch);
	word.erase(remove_if(word.begin(), word.end(), ispunct));
}

stringの句読点を削除する機能を実現できます.
まとめ
コンテナではなく反復器を操作する標準ライブラリアルゴリズムを十分に理解する必要があります.したがって、アルゴリズムは要素を追加または削除することはできません.
参照
  • <>
  • CSDNブログ:CSDNブログ