Перегрузка [] в C ++ для возврата lvalue

Я пишу простой класс хэш-карты:

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];

В частности,

  • For 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 требует, чтобы тип значения имел конструктор с нулевым аргументом. Думаю, я просто построю значение по умолчанию.

5
задан Daniel Lubarov 18 June 2011 в 00:39
поделиться