Я пишу простой класс хэш-карты:
template <class K, class V> class HashMap;
Реализация очень ортодоксальна: у меня есть массив кучи, размер которого увеличивается вдвое, когда он становится большим. В массиве содержатся небольшие векторы пар ключ / значение.
Vector<Pair<K, V> > *buckets;
Я хотел бы перегрузить оператор индекса таким образом, чтобы такой код работал:
HashMap<int, int> m;
m[0] = 10; m[0] = 20;
m[2] = m[1] = m[0];
В частности,
m [k] = v
где m
не содержит k
, я бы хотел добавить новую запись. m [k] = v
] где m
действительно содержит k
, я бы хотел, чтобы старое значение было заменено. v
. Предположительно код будет выглядеть примерно как
V& operator[](K &key)
{
if (contains(key))
{
// the easy case
// return a reference to the associated value
}
else
{
Vector<Pair<K, V> > *buck = buckets + hash(k) % num_buckets;
// unfinished
}
}
Как мне поступить в случае, если ключ не найден? Я бы предпочел по возможности избегать копирования значений в кучу.
Полагаю, я мог бы создать вспомогательный класс, который перегружает как оператор присваивания, так и приведение к V
, но, безусловно, есть более простое решение ?
Правка : Я не понимал, что std :: map требует, чтобы тип значения имел конструктор с нулевым аргументом. Думаю, я просто построю значение по умолчанию.