fix printing sets
minimize allocations on the heap
add copy constructor, overloaded assignment operator