Set¶
Sets are sorted containers of unique elements. The flc_set
module
defines sets of integer
and of type(String)
.
Basic functionality¶
All set types support the following basic operations.
Construction and destruction¶
Like other wrapped C++ classes in Flibcpp, sets are
constructed using an interface function. The default constructor is an empty
set. Sets are destroyed using the release
type-bound subroutine.
Modification¶
The two primary operations on a set are insert
and erase
for adding
an element to and removing an element from the set. A clear
subroutine
removes all elements from the set.
The size
method returns the number of elements, and count
will return
the number of elements of a given value.
Here’s an example of creating, modifying, and destroying a set:
use flc_set, only : Set => SetInt
type(Set) :: s
logical :: inserted
s = Set()
call s%insert(2)
call s%insert(3, inserted) ! Set has 2 elements, inserted => true
call s%insert(3, inserted) ! Duplicate element, ignored; inserted => false
call s%erase(2) ! Remove 2 from the set
call s%erase(1) ! Nonexistent set element, ignored
write(0,*) "Number of 3s in the set:" s%count(3)
call s%clear() ! Remove all elements, size is now zero
call s%insert(1)
call s%release() ! Free memory
Set operations¶
The Fortran Set
classes have been extended to include several useful set
algorithms. (In C++, these are implemented using the <algorithm>
header and
therefore should resemble the functions in
the flc_algorithm module.
All set operations take a single argument, another Set
object, and do not
modify either the original or the argument. All but the includes
return
newly allocated Set
instances and do not modify the original sets.
difference
: \(A \setminus B\)- Returns a new set with all elements from the original that are not present in the other set.
intersection
: \(A \cap B\)- Return all elements that are in both sets.
symmetric_difference
: \((A \setminus B) \cup (B \setminus A)\)- Return all elements that are in one set or the other but not both.
union
: \(A \cup B\)- Return all elements that are in either set.
includes
: \(A \supseteq B\)- Return whether all elements of the other set are in the original set.
Iteration¶
Iterating over a set to determine its contents is not yet supported.
Numeric sets¶
Unlike vectors, the flc_set
module includes
a single “native integer” numeric instantiations. The value type is
integer(C_INT)
and is 64 bits on most modern systems. Since the C++
implementation of numerical sets is not very efficient, the assumption is that
the set
will be used in a non-numerically-intensive capacity where the
default integer is the most appropriate option.
Construct from an array¶
Numeric sets can be created very efficiently from Fortran data by accepting an array argument:
use flc_set, only : Set => SetInt
type(Set) :: s
s = Set([1, 1, 2, 10])
write(0,*) "Size should be 3:", s%size()
The assign
bound method acts like a constructor but for an existing set.
String sets¶
The native “element” type of SetString
is a character(len=:)
. Set
operations that accept an input will take any native character string; and
returned values will be allocatable character arrays.
An additional insert_ref
function allows assignment of
String types