Это связано с первым выпуском Item в Effective C # с предупреждением о переопределении GetHashCode()
наивно.
Извините, у меня нет кода поддержки.Кстати, это не домашняя работа, я просто не очень знаком с C++/STL
и не могу найти информацию о реализации.
Предположим, я создаю свой собственный класс с именем person, у которого есть 3 открытых изменяемых строковых поля:
- Имя,
- Средний инициал
- Фамилия
Он также предоставляет меньше оператора для сравнения одного человека сдругой, основанный сначала на имени, затем отчестве, а затем на фамилии - вот и все.
Я создаю карту от человека до int (скажем, по возрасту) и заполняю ее примерно 20 ключами / значениями.пар.Я также храню указатели на мои ключи в массиве.Затем я изменяю имя объекта, на который указывает пятый указатель, и пытаюсь найти соответствующий возраст, используя этот модифицированный ключ (помните, что объект изменчив и широко открыт).
Почему это произошло?
A) Поскольку ключ, используемый std::map
, не изменился (был скопирован), и я изменил свою собственную копию, и теперь мой ключ не найден.Но как это может быть?Я не предоставил свой собственный конструктор копирования.Возможно, компилятор создал файл по умолчанию?
B) Коллекция std::map
на самом деле является красно-черным деревом, и у меня был прямой указатель на ключ.Когда я изменил ключ, я изменил его непосредственно в узле дерева.Теперь вполне вероятно, что мой узел расположен неправильно и не будет найден при использовании правильного алгоритма поиска по дереву.Я должен был удалить узел, затем изменить ключ и снова вставить его.Если это так, то я подозреваю, что коллекции STL
в целом довольно опасны и заставляют новичков совершать много ошибок.
C) Что-то еще?
Буду признателен за ваши идеи.