The StateVector and DensityOperator classes (and their non-orthogonal counterparts) exist for two main reasons:
blitz::Array
uses by-reference copy semantics and expression templates, these classes use the more usual by-value copy semantics and normal semantics for arithmetic operations. This means, however, that copying and arithmetics should be used judiciously, if possible only in the startup phase of simulations.