Another is to delay sorting until grade() or roster() is called.
A third is to not sort it at all and let the caller sort if they need to. After all, why should class school assume that the caller needs the data sorted?
If the standard comparison for std::set isn't what is required, then an alternative comparison function can be provided. If the data is required sorted in different ways which are pre-known, then different std::set can be used for each required sort order.