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