reordered includes and the unique_ptr of features has been replaced by a shared pointer due to the inability of returning references out of a (class) internal vector