Два списка хороши, но требуют совершенно другой обработки.
list<Employee*>group;
- это список указателей на объекты типа Employee, и вы будете хранить там указатели на объекты, размещенные динамически, и вам нужно будет особенно четко определить, кто будет удалять эти объекты.
list<Employee>group;
- список объектов типа Employee; вы получаете выгоду (и связанные с этим затраты с точки зрения производительности) от работы с конкретными случаями, когда вам не нужно управлять памятью самостоятельно.
В частности, одним из преимуществ использования std::list
по сравнению с обычным массивом является то, что вы можете иметь список объектов и избежать затрат и рисков, связанных с динамическим выделением памяти и указателями.
Со списком объектов вы можете сделать, e. г.
Employee a; // object allocated in the stack
list.push_back(a); // the list does a copy for you
Employee* b = new Employee....
list.push_back(*b); // the object pointed is copied
delete b;
Со списком указателей вы вынуждены использовать на практике всегда динамическое распределение или ссылаться на объект, время жизни которого больше, чем у списка (если вы можете гарантировать это).
Используя указатели std :: list, вы более или менее находитесь в той же ситуации, что и при использовании простого массива указателей в том, что касается управления памятью. Единственное преимущество, которое вы получаете, заключается в том, что список может динамически увеличиваться без усилий с вашей стороны.
Лично я не вижу большого смысла в использовании списка указателей; в основном, потому что я думаю, что указатели должны использоваться (всегда, когда это возможно) через умные указатели . Так что, если вам действительно нужны указатели, вам, IMO, будет лучше, если использовать список умных указателей, предоставленных boost.