Re[9]: Перенос объекта в map
От: rg45 СССР  
Дата: 04.06.25 08:10
Оценка: 4 (1) +1
Здравствуйте, 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
для того и запретил копирование и перемещение, чтобы продемонстрировать, что не выполняется ни то, ни другое.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 04.06.2025 8:17 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.