Какой самый быстрый способ изменить ключ элемента внутри std :: map

Я понимаю причины, по которым нельзя просто сделать это (перебалансировка и прочее):

iterator i = m.find(33);

if (i != m.end())
  i->first = 22;

Но пока единственный способ (о котором я знаю) изменить ключ - это полностью удалить узел из дерева, а затем вставьте значение обратно с другим ключом:

iterator i = m.find(33);

if (i != m.end())
{
  value = i->second;
  m.erase(i);
  m[22] = value;
}

Это кажется мне довольно неэффективным по другим причинам:

  1. проходит дерево трижды (+ баланс) вместо дважды (+ баланс)
  2. еще одна ненужная копия значение
  3. ненужное освобождение, а затем перераспределение узла внутри дерева

Я считаю, что распределение и освобождение являются худшими из этих трех. Я что-то упустил или есть более эффективный способ сделать это?

ОБНОВЛЕНИЕ:

iterator i = m.find(33);

if (i != m.end())
  i->first = 22;

Но пока единственный способ (о котором я знаю) изменить ключ - это полностью удалить узел из дерева, а затем вставить значение обратно с другим ключом:

iterator i = m.find(33);

if (i != m.end())
{
  value = i->second;
  m.erase(i);
  m[22] = value;
}

Это кажется мне довольно неэффективным по многим причинам :

  1. проходит дерево трижды (+ баланс) вместо двух (+ баланс)
  2. еще одна ненужная копия значения
  3. ненужное освобождение и затем перераспределение узла внутри дерева

Я считаю, что распределение и освобождение являются худшими из этих трех. Я что-то упустил или есть более эффективный способ сделать это?

ОБНОВЛЕНИЕ:

iterator i = m.find(33);

if (i != m.end())
  i->first = 22;

Но пока единственный способ (о котором я знаю) изменить ключ - это полностью удалить узел из дерева, а затем вставить значение обратно с другим ключом:

iterator i = m.find(33);

if (i != m.end())
{
  value = i->second;
  m.erase(i);
  m[22] = value;
}

Это кажется мне довольно неэффективным по многим причинам :

  1. проходит дерево три раза (+ баланс) вместо дважды (+ баланс)
  2. еще одна ненужная копия значения
  3. ненужное освобождение и затем перераспределение узла внутри дерева

Я считаю, что распределение и освобождение являются худшими из этих трех. Я что-то упустил или есть более эффективный способ сделать это?

ОБНОВЛЕНИЕ:

  1. проходит дерево трижды (+ баланс) вместо двух (+ баланс)
  2. еще одна ненужная копия значения
  3. ненужное освобождение и затем перераспределение узла внутри дерева

I считают распределение и освобождение худшими из этих трех. Я что-то упустил или есть более эффективный способ сделать это?

ОБНОВЛЕНИЕ:

  1. проходит дерево трижды (+ баланс) вместо двух (+ баланс)
  2. еще одна ненужная копия значения
  3. ненужное освобождение и затем перераспределение узла внутри дерева

I считают распределение и освобождение худшими из этих трех. Я что-то упустил или есть более эффективный способ сделать это?

ОБНОВЛЕНИЕ: Я думаю, что теоретически это должно быть возможно, поэтому не думаю, что изменение структуры данных оправдано. Вот псевдоалгоритм, который я имел в виду:

  1. найти узел в дереве, ключ которого я хочу изменить.
  2. отсоединить, если от дерева (не освобождать)
  3. перебалансировать
  4. изменить ключ внутри отсоединенного узла
  5. вставьте узел обратно в дерево
  6. rebalance
51
задан Peter Jankuliak 21 April 2011 в 01:40
поделиться