Информация об изменениях

Сообщение Re[9]: Перенос объекта в map от 04.06.2025 8:10

Изменено 04.06.2025 8:17 rg45

Re[9]: Перенос объекта в map
Здравствуйте, pva, Вы писали:

pva>extract() возвращает тот же самый handler, mapped() возвращает ref, а emplace реализует movable семантику. В каком месте происходит копирование — для меня пока загадка.


emplace обеспечивает конструирование объекта "по месту" — в соответствии с фактическими параметрами, передаваемыми конструктору. В данном случае параметром для конструирования объекта является lvalue ссылка, которую вернул mapped. Соответственно конструирование "по месту" будет выполнено через конструктор копирования (даже не перемещения).

pva>addon. 3) стало интересно как можно было бы "без использования node-handle  и extract ... с меньшими накладными расходами реализовать операцию". Впрочем, очевидно перегрузив map и реализовав перенос ключа. Хотя это и прибивало бы код гвоздями к конкретной реализации map.


Ну, максимум, чего можно было бы добиться — это замены копирования на перемещение, обернув mapped в move:

nodes.emplace(newKey, std::move(nodes.extract(oldKey).mapped()));


Только это всё равно это хуже, чем если просто подменить ключ у существующей записи, избежав как копирования, так и перемещения.
Re[9]: Перенос объекта в map
Здравствуйте, pva, Вы писали:

pva>extract() возвращает тот же самый handler, mapped() возвращает ref, а emplace реализует movable семантику. В каком месте происходит копирование — для меня пока загадка.


emplace обеспечивает конструирование объекта "по месту" — в соответствии с фактическими параметрами, передаваемыми конструктору. В данном случае параметром для конструирования объекта является lvalue ссылка, которую вернул mapped. Соответственно конструирование "по месту" будет выполнено через конструктор копирования (даже не перемещения).

pva>addon. 3) стало интересно как можно было бы "без использования node-handle  и extract ... с меньшими накладными расходами реализовать операцию". Впрочем, очевидно перегрузив map и реализовав перенос ключа. Хотя это и прибивало бы код гвоздями к конкретной реализации map.


Ну, максимум, чего можно было бы добиться — это замены копирования на перемещение, обернув mapped в move:

nodes.emplace(newKey, std::move(nodes.extract(oldKey).mapped()));


Только это всё равно это хуже, чем если просто подменить ключ у существующей записи, избежав как копирования, так и перемещения. Я в своём примере
Автор: rg45
Дата: 03.06 19:39
для того и запретил копирование и перемещение, чтобы продемонстрировать, что не выполняется ни то, ни другое.