Bitsets
Nim comes with a built in way to build a set of ordinal types. In order for a type to be usable in a bitset, it must be an ordinal and high(T) < 216
. For sets of non-ordinal types, see the sets module, which contains hashsets.
However, best practice is to keep bitset size significantly smaller since each possible element in the set consumes one bit, therefore a bitset of 216 elements will consume 65,536 bits (i.e. 8,192 bytes, or 8KiB).
Bitsets have all the useful operations of mathematical sets:
Operator | Description | Example Code |
---|---|---|
a in B |
is a an element of B? | 'd' in {'a'..'z'} |
a notin B |
is a not an element of B? | 40 notin {2..20} |
A + B |
union of A with B | {'a'..'m'} + {'n'..'z'} == {'a'..'z'} |
A - B |
relative complement of A in B | {'a'..'z'} - {'b'..'d'} == {'a', 'e'..'z'} |
A + {b} |
add element b to set A | {'b'..'z'} + {'a'} == {'a'..'z'} |
A - {b} |
remove element b from set A | {'a'..'z'} - {'a'} == {'b'..'z'} |
A * B |
intersection of A with B | {'a'..'m'} * {'c'..'z'} == {'c'..'m'} |
A <= B |
is A a subset of B? | {'a'..'c'} <= {'a'..'z'} |
A < B |
is A a strict subset of B? | {'b'..'c'} < {'a'..'z'} |