Взаимосвязанный список с использованием std :: unique_ptr

Кто-нибудь предлагает реализацию? Я попробовал это дома на днях и обнаружил, что семантика перемещения слишком сложна, чтобы установить предыдущую ссылку или простой связанный список. Легко сделать дерево, используя std :: unique_ptr. Конечно, std :: shared_ptr позволяет легко реализовать этот вопрос благодаря функции copy / assign. Так как насчет этого?

3

Решение

Поскольку вопрос был вновь открыт, я опубликую свой комментарий, так как я думаю, что это ответ:

Если вы имеете в виду использование только unique_ptr, это будет невозможно, так как в двусвязном списке у вас есть два указатели, указывающие на каждый элемент, и, таким образом, они не могут быть оба unique_ptrs. (Это противоречило бы уникальный часть как-то …)

Для пояснения рассмотрим список из трех элементов: A <-> B <-> C Вот A будет содержать unique_ptr next, указывая на B и, следовательно, владеющий B, C будет иметь unique_ptr prev, готовясь к B а также — и владеть этим тоже. Два unique_ptrвладение одним и тем же объектом противоречит закону unique_land, и вам придется приложить немало усилий для его достижения из-за unique_ptrСвойства только для перемещения.

Альтернативой будет список, в котором next указатели unique_ptrs, в то время как last указатели — это простые старые C-указатели — я не вижу там особых проблем, поэтому не думаю, что это то, что вы хотели.

Но если Вы имели в виду нечто наподобие этого «наполовину уникального списка», предоставьте некоторый код и расскажите нам, с чем у вас проблемы — мы с радостью поможем 🙂

5

Другие решения

Вот что я использую,

https://gist.github.com/mukunda-/153d802065c130e2956c

Конечно, он использует «полууникальный» метод, поскольку это единственный возможный способ.

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

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

0

да, это можно сделать, используя любой из указателей (следующий или предыдущий) как unique_ptr, а другой — как необработанный указатель.
См. CppCon 2016: Херб Саттер «Утечка свободы в C ++ … По умолчанию».
CppCon 2016: Херб Саттер «Утечка свободы в C ++ … по умолчанию».

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector