Чтобы добавить к тому, что сказал, если объект Employee содержит свой собственный ключ, вам, вероятно, следует использовать set
.Чтобы использовать этот набор, вам необходимо явно определить метод сравнения для объекта Employee.Есть два способа сделать это: либо определить оператор <для объекта: </p>
class Employee
{
public:
bool operator<(const Employee &rhs)
{
return strcmp(lastName, rhs.lastName) < 0;
}
...
};
Или вы можете определить функтор, который вы указываете набору для использования:
struct EmployeeLessThan
{
bool operator()(const Employee &lhs, const Employee &rhs)
{
return strcmp(lhs.lastName, rhs.lastName) < 0;
}
};
std::set<Employee, EmployeeLessThan> myEmployees;
Изменить: Одна очень важная вещь, которую нужно иметь в виду, это то, что set
хранит все свои предметы как const
.Это происходит потому, что изменение элемента в set
может изменить порядок элементов, а set
не может обнаружить это и изменить порядок.Это может быть проблематично, если вы хотите обновить любого из сотрудников, содержащихся в наборе.Лучший способ обойти эту проблему - объявить любой элемент данных Employee, который вы можете захотеть изменить, как mutable
.Это позволит вам изменять их значения, даже когда оно const
.
Edit2: если вы решите продолжить использовать карту, а ключ - char *
, имейте в виду, что по умолчанию карта собираетсясравнить два char *
s по значению их указателя, а не по строке, на которую они указывают.В этом случае лучше всего использовать std::string
вместо char *.Кроме того, вы можете определить функтор для передачи на карту:
struct CharStarLessThan
{
bool operator()(const char *lhs, const char *rhs)
{
return strcmp(lhs, rhs) < 0;
}
};
std::map<char *, Employee, CharStarLessThan> myEmployees;