unordered_set
ハッシュベースの一意な要素
「unordered_set」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
unordered_set とは
std::unordered_set は一意な要素をハッシュテーブルに格納します。メンバーシップテストは平均で定数時間ですが、ソート順はありません。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3, 2, 1};
std::cout << s.size() << " unique values\n";
return 0;
}set と unordered_set の比較
map の場合と同様です。
set: ソートされ、操作は O(log n)unordered_set: 順序付けされず、操作は平均 O(1)
最速のメンバーシップ確認が必要なら unordered_set を選びます。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> seen{"a", "b", "c"};
std::cout << (seen.count("b") ? "yes" : "no") << '\n';
return 0;
}値を挿入する
insert() は要素を追加します。すでに存在する場合は無視し、追加されたかどうかを .second で示すペアを返します。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s;
auto a = s.insert(5);
auto b = s.insert(5);
std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
return 0;
}高速なメンバーシップテスト
ある値をすでに確認したかどうかを調べるのが、典型的な用途です。count() は 0 または 1 を返します。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> blocked{"spam", "junk"};
std::cout << blocked.count("spam") << '\n';
std::cout << blocked.count("ok") << '\n';
return 0;
}要素を削除する
erase() は値を削除し、削除した要素数(0 または 1)を返します。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3};
s.erase(2);
std::cout << "count 2: " << s.count(2) << '\n';
std::cout << "size: " << s.size() << '\n';
return 0;
}重複を検出する
要素を挿入し、そのブール結果を確認することで、ストリーム内の最初の重複を検出できます。
#include <iostream>
#include <unordered_set>
int main() {
int data[] = {3, 7, 1, 7, 9};
std::unordered_set<int> seen;
for (int x : data) {
if (!seen.insert(x).second) {
std::cout << "first duplicate: " << x << '\n';
break;
}
}
return 0;
}反復処理
反復処理はできますが、順序は未規定です。特定の並びを前提にせず、要素を合計したり処理したりしてください。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{10, 20, 30};
int total = 0;
for (int x : s) total += x;
std::cout << "sum = " << total << '\n';
return 0;
}範囲から重複を除去する
範囲から unordered_set を構築すると、重複をすばやく除去できます(順序は保持されません)。
#include <iostream>
#include <unordered_set>
#include <vector>
int main() {
std::vector<int> v{1, 2, 2, 3, 3, 3};
std::unordered_set<int> u(v.begin(), v.end());
std::cout << u.size() << " unique\n";
return 0;
}find と count の比較
find() は要素へのイテレータを返すため、その要素をさらに使用できます。一方、count() は存在するかどうかを報告するだけです。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> s{"alpha", "beta"};
auto it = s.find("beta");
std::cout << (it != s.end() ? *it : "none") << '\n';
return 0;
}クリアと空かどうかの確認
clear() はすべての要素を削除し、empty() は要素がないかどうかを確認します。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3};
s.clear();
std::cout << std::boolalpha << s.empty() << '\n';
return 0;
}集合の共通部分
共通する要素を見つけるには、一方の集合をループし、もう一方の集合でメンバーシップを確認します。
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> a{1, 2, 3, 4};
std::unordered_set<int> b{3, 4, 5};
for (int x : a) if (b.count(x)) std::cout << x << ' ';
std::cout << '\n';
return 0;
}クイックチェック
unordered_set について、理解度を確認しましょう。
まとめ
std::unordered_set について、次のことを学びました。
- 平均 O(1) の操作で一意な要素を格納する
- 順序は保証されない
- 高速なメンバーシップテストと重複検出に最適である
次は、独自のカスタム型をハッシュする方法を学びます。
よくある質問
「unordered_set」レッスンは無料ですか?
はい。「unordered_set」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「unordered_set」で何を学びますか?
ハッシュベースの一意な要素 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「unordered_set」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- std::unordered_map
- unordered_set
- カスタムハッシュ関数
- パフォーマンス上の考慮事項