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