24 / 14 / 10
Регистрация: 11.08.2019
Сообщений: 58
1

Совместное владение

23.08.2019, 21:11. Показов 460. Ответов 9
Метки нет (Все метки)

Подскажите, можно ли реализовать так называемое совместное владение. Допустим я создаю сложносвязную структуру, которая содержит указатели на родителя, брата, второго брата и так далее, и когда объект не имеет кого-либо из перечисленных, он ссылается на ограничитель NIL. И если вдруг мне стало необходимо удалить всю структуру, мне придётся для каждого элемента проверять, является ли кто-то из его родственников NIL, так как иначе я удалю его более 1 раза, что сулит проблемы. Удалив его впервые, мы забракуем указатель лишь внутри той структуры, в которой произвели удаление. Было бы неплохо, если бы одно удаление и присваивание указателю nullptr браковало все остальные указатели на этот объект. Пришло в голову использовать указатели на указатели, но как-то это слишком сложно...
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2019, 21:11
Ответы с готовыми решениями:

Передать владение unique_ptr в map
Доброго! Как можно передать владение unique_ptr в map? Я хочу именно не скопировать, а полностью...

Совместное использование классов
Здравствуйте, возник такой вопрос, как следует писать код, чтобы 2 не зависимых класса могли...

Ребят C++ и Assembler(совместное)
ребят помогите с задачей.Очень нужно. В модуле на C++ вводятся элементы одномерного массива...

Совместное использование cin и geline
У меня возник один не очень сложный вопрос, но ,кроме обмана компилятора, я не смог найти решение)...

9
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
23.08.2019, 22:19 2
Цитата Сообщение от ddvamp1 Посмотреть сообщение
Пришло в голову использовать указатели на указатели, но как-то это слишком сложно...
Используй shared_ptr/weak_ptr
0
24 / 14 / 10
Регистрация: 11.08.2019
Сообщений: 58
23.08.2019, 23:08  [ТС] 3
Окей, допустим структура
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Arc {
   static Arc* NIL;
   int key;
   Arc* parent;
   Arc* left;
   Arc* right;
 
   Arc() : key{} { parent = left = right = nullptr; }
   explicit Arc(int value) : key{ value } { parent = left = right = NIL; }
   ~Arc() {
      delete left;
      delete right;
   }
}
Arc* Arc::NIL{ new Arc };
Как это сюда прикрутить?
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
23.08.2019, 23:09 4
Цитата Сообщение от ddvamp1 Посмотреть сообщение
Как это сюда прикрутить?
Увеличение счетчика ссылок уже сами прикрутите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Arc {
    static Arc* NIL;
    int key;
    Arc* parent;
    Arc* left;
    Arc* right;
 
    Arc() : key{} { parent = left = right = nullptr; }
    Arc(int value) : key{ value } { parent = left = right = NIL; }
    void remove()
    {
        if(!--linkCount)
            delete this;
    }
    ~Arc() {
    parent->remove();
    left->remove();
    right->remove();
    }
    std::size_t linkCount=0;
}
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
23.08.2019, 23:10 5
Цитата Сообщение от ddvamp1 Посмотреть сообщение
Как это сюда прикрутить?
Очевидно, вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Arc 
{
    Arc(int value = 0)
    : key{value} 
    { 
    }
 
    int key;
 
    std::weak_ptr<Arc> parent;
    std::shared_ptr<Arc> left;
    std::shared_ptr<Arc> right;
 
};
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
23.08.2019, 23:13 6
Цитата Сообщение от ddvamp1 Посмотреть сообщение
. Допустим я создаю сложносвязную структуру, которая содержит указатели на родителя, брата, второго брата и так далее
ddvamp1, дело даже не в том, что непонятно что такое:
Цитата Сообщение от ddvamp1 Посмотреть сообщение
и так далее
хуже то, что непонятно что такое
Цитата Сообщение от ddvamp1 Посмотреть сообщение
сложносвязную структуру
Это двоичное дерево?
ddvamp1, логика владения/порождения/уничтожения/передачи-приёма определяется логикой создаваемой структуры. У двоичного дерева, например, сам процесс удаления нода, гораздо сложнее, чем просто проверка наличия присоединённых листьев. Тут требуется перестройка структуры (не нода) в области удаления. То есть, если удаляется нод ,то если все связи были заполнены, то образовалось три свободных и нужно пересобрать данное место. Это чуть сложнее (даже если балансировку не затрагивать), чем проверка наличия непустых связей. Если у вас с этим нет проблем, то и вопрос не актуален. Может быть, я не понял о чём вы говорите?
0
24 / 14 / 10
Регистрация: 11.08.2019
Сообщений: 58
23.08.2019, 23:14  [ТС] 7
Цитата Сообщение от Renji Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
void remove()
{
   if(!--linkCount)
      delete this;
}
~Arc() {
parent->remove();
left->remove();
right->remove();
}
1. Такой деструктор удалит лишь один объект, а мне нужно удалить целиком совокупность связанных объектов.
2. Вес смысл вопроса был в том, чтобы не проверять при каждом удалении счётчики или является ли указатель NIL, а просто вызвать delete;
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
23.08.2019, 23:19 8
Цитата Сообщение от ddvamp1 Посмотреть сообщение
1. Такой деструктор удалит лишь один объект, а мне нужно удалить целиком совокупность связанных объектов.
Пожалуй да, если в вашем графе получается кольцо из ссылок, счетчики не помогут. shared_ptr, впрочем, тоже. На сколько я помню, у него под капотом те же счетчики.
Ну, тогда самым простым вариантом мне видится завести отдельный std::vector, в который эту самую совокупность объектов и сложить. А потом ехать по вектору циклом и удалять все элементы.
0
24 / 14 / 10
Регистрация: 11.08.2019
Сообщений: 58
23.08.2019, 23:20  [ТС] 9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это двоичное дерево?
Да, можно сказать это двоичное дерево. Логика перестроения мне понятна. Мне нужна функция удаления дерева, если на каком-то моменте оно стало ненужным.
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
24.08.2019, 00:02 10
Цитата Сообщение от ddvamp1 Посмотреть сообщение
Мне нужна функция удаления дерева, если на каком-то моменте оно стало ненужным.
Если речь обо всём дереве, то есть стандартные решения. В вашем случае (нод хранит обратную ссылку на родителя), удаление сводится к нахождению конечного (не имеющего детей) нода в ветке, удаления, обнуление указателя в родителе и перехода в родительский нод, откуда продолжаем поиск нового конечного нода, проходя по ветке в которой может быть дочерний нод. Если родитель не содержит детей - повторяем удаление. В сети есть реализаций. И на форуме тоже. Если бы тему назвали как-то вроде "двоичное дерево", внизу страницы топика нашли бы много интересного. А теперь можно воспользоваться поиском по форуму)

Добавлено через 10 минут
https://neerc.ifmo.ru/wiki/ind... 0.BC.D0.B0
вот на Паскале, но неплохо описано)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2019, 00:02

Совместное использование указателей и ссылок
int *ptr; int &amp;ref = *ptr; ref = 1; Вот и весь вопрос. Ничего плохого в этом нет?

Совместное использование sptintf и std::string
Хотелось бы получить форматированную строку в переменной типа std::string, Максимально простым...

Владение C# с MySQL
Вобщем попался вопрос о владении C# с MySQL. Это издеватели чтоль? Че за причуды живой природы? :)...

Разработка теста на владение клавиатурой на JavaScript
Всем привет! Вопросик на этот раз серьезный… Написал на ява скрипте тест на владение слепым...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.