станд.:: карта и поведение уже вставленных данных

Делает std::map уже переместить вставленные значения при вставке новых данных?

6
задан Konstantin 19 March 2010 в 12:24
поделиться

4 ответа

Карта реализована как дерево, и когда вы вставляете новый элемент, может потребоваться перебалансировка дерева.

Это не делает недействительными какие-либо итераторы или ссылки на элементы в дереве. Эта балансировка выполняется с помощью манипуляций с указателями, поэтому вам не о чем беспокоиться; сами узлы остаются на месте.

Балансировка включает в себя изменение структуры дерева, сообщая узлам, кто их дети, родители, братья и сестры, путем переназначения указателей, но это деталь реализации. По логике ничего не изменилось.

9
ответ дан 9 December 2019 в 22:32
поделиться

Рассмотрим типичный узел в двусвязном списке:

template <class T>
struct Node
{
  Node* mPrevious;
  Node* mNext;
  T mValue;
};

При вставке нового узла между двумя существующими все, что вам нужно сделать, - это немного изменить проводку.

void insert(Node* target, Node* newNode)
{
  target->mPrevious->mNext = newNode;
  target->mPrevious = newNode;

  newNode->mPrevious = target->mPrevious;
  newNode->mNext = target;
}

Поведение аналогично std :: map (или std :: set , std :: multimap или std :: multiset). , поскольку все они в целом реализованы с использованием одной и той же базовой структуры).

Это означает, что любой итератор, указывающий на существующий элемент, также остается действительным. Я настаиваю на существующем бите элемента . Итератор, возвращаемый end , должен быть повторно вычислен после вставки или удаления, и его лучше не кэшировать.

0
ответ дан 9 December 2019 в 22:32
поделиться

Стандарт C ++ не диктует реализацию std :: map только его поведение и эффективность. Реализациям разрешено перемещать элементы; однако это может быть неэффективным.

Большинство контейнеров std :: map реализованы с использованием древовидной структуры данных со ссылками. При вставке или изменении порядка элементов ссылки изменяются, но данные не перемещаются. Перемещение элементов замедлит время выполнения std :: map .

0
ответ дан 9 December 2019 в 22:32
поделиться

Стандарт не предписывает конкретные реализации STL, только поведение и характеристики времени выполнения. Учитывая это, пропущенный список или дерево - это, скорее всего, реализация std::map, поэтому ссылки будут обновляться, и относительное упорядочивание будет меняться, но фактические данные не будут перемещаться.

2
ответ дан 9 December 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: