Skip to content

Instantly share code, notes, and snippets.

@cia-rana
Created April 18, 2019 13:23
Show Gist options
  • Save cia-rana/234668c13d96c6308812e67fa04c85de to your computer and use it in GitHub Desktop.
Save cia-rana/234668c13d96c6308812e67fa04c85de to your computer and use it in GitHub Desktop.
集合に必要な操作

集合に必要な操作

概要

集合を標準ライブラリとして実装している言語は数多く存在するが、言語ごとに実装されている操作は同じわけではない。そこで、言語ごとにどのような操作が実装されているか俯瞰し、プログラミング言語で集合を実装する上で必須の操作は何か述べる。

集合の定義

本文において集合とは、「等価な要素を高々1つ持つ、0個以上の離散個の要素を1つにまとめたデータ構造」とする。ここで「等価な要素」はプログラミング言語ごとにそれぞれ自由に定義して良いが、ある要素がある集合に含まれるかどうか判別できなければならない。

言語ごとに実装されている操作

C++17

C++のSTLで実装されている集合にはC++11以前から存在するstd::setとC++11から実装されたstd::unordered_setがある。std::setは要素を順序付き(strict weak ordering)で保持し、データ構造は赤黒木で実現されている。一方でstd::unordered_setstd::setとは異なり、要素間の順序に関係なく要素を保持し、データ構造はハッシュテーブルで実現されている。本文における集合は、そのデータ構造が順序を保持するかしないかは関係ないため、順序を保持しないstd::unordered_setの操作についてのみ述べる。

empty

集合が空かどうか判別する。

size

集合が持つ要素の数を取得する。

max_size

集合が保持可能な最大の要素数を取得する。

insert

集合に1つ要素を追加する。

erase

集合から指定した1つの要素を削除する。

clear

集合が保持する全ての要素を削除する。

merge

集合に他の集合が保持する全ての要素を追加する。

Ruby

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment