Является ли вторая часть карты <.., ..> стабильной? - PullRequest
6 голосов
/ 18 марта 2012

Если у нас есть map <int, vector<int> >, то vector s перемещаются, когда красно-черное дерево карты изменяется или оно сохраняет указатели на vector s или что-то подобное и не перемещает их (иначе работа с картами, выигранными больше не будет O (LG N), например, если мы push_back элементы к некоторым vector с)

Ответы [ 3 ]

9 голосов
/ 18 марта 2012

Смотрите это: std :: map, указатель на значение ключа карты, возможно ли это?

the second top answer:

Раздел 23.1.2 # 8 (требования к ассоциативным контейнерам):

"Элементы вставки не должны влиять на действительность итераторов и ссылок на контейнер, а члены стирания должны делать недействительными только итераторы и ссылки на стертые элементы."

То есть да хранение указателей на элементы данных элемента карты гарантированно будет действительным, если только вы не удалите этот элемент.

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

1 голос
/ 18 марта 2012

Я считаю, что C ++ 03 не дает никаких гарантий стабильности данных в памяти , и это будет деталью реализации (и на самом деле это не то, что вы можете безопасно предположить без тестирования).

Обратите внимание, что сохранение итераторов на карте и расположение фактического вектора в памяти - это совершенно разные вещи .Действительность итераторов четко определена (когда они действительны, а когда нет) в спецификации C ++, но фактическое внутреннее поведение дерева - нет.

Тем не менее, любой достойный компилятор(для релизных сборок / с включенной оптимизацией) реализация оптимизировалась бы так, чтобы фактически не копировать вектор при его перемещении в дереве, а реализации C ++ 11 std::map будут использовать семантику перемещения для гарантии такого поведения.

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

1 голос
/ 18 марта 2012

Нет, векторы не будут перемещаться.Манипуляции с деревом просто переставляют указатели между узлами.Они не перемещают узлы или их содержимое в памяти.

...