C++でセットから要素を削除します
1.C++のセットから1つの要素を削除します。
2.述語を満たすC++のセットから条件付きで要素を削除します。
1.1つの要素を削除する
セットコンテナから単一の要素を削除することは、C++では非常に簡単です。アイデアは、与えられた要素をに渡すことです set::erase
セットからそれを消去する関数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <iostream> #include <unordered_set> int main() { std::unordered_set<char> s = { 'a', 'b', 'c', 'd' }; int key = 'd'; s.erase(key); for (char const &c: s) { std::cout << c << ' '; } return 0; } |
出力:
c b a
2.述語を満たすすべての要素を削除します
述語を満たすセットから条件付きで要素を削除することもできます。アイデアは、イテレータを使用してセットを反復し、 unordered_set::erase
現在の要素が条件に一致する場合に機能します。を呼び出すことに注意してください erase()
反復中の関数はイテレータを無効にするため、特別な注意が必要です。これはいくつかの方法で処理できます。
1.で C++11
以上、 erase()
次の要素またはにイテレータを返します unordered_set::end
最後の要素が削除された場合。アイデアはの戻り値を使用することです erase()
以下に示すように、イテレータを次の要素に設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <unordered_set> #include <cctype> int main() { std::unordered_set<char> s = { 'A', 'b', 'c', 'D' }; auto it = s.begin(); while (it != s.end()) { if (isupper(*it)) { it = s.erase(it); } else { ++it; } } for (char const &c: s) { std::cout << c << ' '; } return 0; } |
出力:
c b
2.で C++98/03
, erase()
次の要素にイテレータを返しません。回避策は、イテレータがに渡された後にイテレータをインクリメントすることです erase()
しかし前に erase()
実行されます。これにより、イテレータのコピーが erase()
関数であり、イテレータは以前にすでにインクリメントされているため、無効化されません erase()
と呼ばれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include <unordered_set> #include <cctype> int main() { std::unordered_set<char> s = { 'A', 'b', 'c', 'D' }; for (auto it = s.begin(); it != s.end();) { if (isupper(*it)) { s.erase(it++); } else { it++; } } for (char const &c: s) { std::cout << c << ' '; } return 0; } |
出力:
c b
3.別の良い代替手段は、 erase()
イテレータを次の要素に進めた後、現在のイテレータの複製で機能します。これは、イテレータの暗黙的なコピーが関数に渡される前のアプローチとまったく同じように機能します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> #include <unordered_set> #include <cctype> int main() { std::unordered_set<char> s = { 'A', 'b', 'c', 'D' }; auto it = s.cbegin(); while (it != s.cend()) { auto curr = it++; if (isupper(*curr)) { s.erase(curr); } } for (char const &c: s) { std::cout << c << ' '; } return 0; } |
出力:
c b
4.別の解決策は、セットを反復して構築することです 「削除されるリスト」 述語を満たす要素へのイテレータの数。次に、そのリストをループして呼び出します set::erase
各イテレータで。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> #include <unordered_set> #include <list> #include <cctype> int main() { std::unordered_set<char> s = { 'A', 'b', 'c', 'D' }; std::list<std::unordered_set<char>::const_iterator> iterators; for (auto it = s.cbegin(); it != s.cend(); it++) { if (isupper(*it)) { iterators.push_back(it); } } for (auto const &i: iterators) { s.erase(i); } for (char const &c: s) { std::cout << c << ' '; } return 0; } |
出力:
c b
これで、C++のセットから要素を削除できます。