### Array class

Linear data structure with random access. Similar to STL's std::vector class. The main differences are the following.

- no intelligent resize
- smart pointers for reference counting
- compile time switch -DINDEX_CHECKS enforces array bound checking enforced

### Map class

Associative container class based on an AVL tree structure. Logarithmic cost for access, insert, and delete. Similar to STL's std::map class.

### Vector and Matrix classes

Linear data structures for number types with random access. Functionality as expected from linear algebra, typical operators defined.

- smart pointers for reference counting
- compile time switch -DINDEX_CHECKS enforces array bound checking
- compile time switch -DDIMENSION_CHECKS verifies whether operands in an expression are of appropriate dimensions

There are also the sparse variants SparseVector and SparseMatrix built from AVL trees. Sparse and dense vectors and matrices can arbitrarily be mixed in expressions.

### Set class

Ordered sets realized as AVL trees. Typical set operators defined.

- smart pointers for reference counting

There is also the Bitset class. Operands from both classes can arbitrarily mixed in expressions. Beware of collateral costs in case of too many implicit conversions though.

### Incidence Matrix class

This is essentially a SparseMatrix with bool entries. Again based on AVL trees.

- smart pointers for reference counting

### Graph class

Graphs are realized as adjacency lists. Similar to an IncidenceMatrix where the rows columns are indexed by the nodes. By default our graphs are undirected. There is also a directed variant. Node and edge labels of arbitrary type optional.

- smart pointers for reference counting