Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
#1

Умные указатели - C++

05.02.2014, 22:34. Просмотров 545. Ответов 2
Метки нет (Все метки)

Пишу класс дерево поиска:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T, typename Compare>
class AvlTree {
    private:
        struct Node {
            T key;
            size_t height;
            std::unique_ptr<Node> leftChild;
            std::unique_ptr<Node> rightChild;
 
            explicit Node(const T &key) : key(key), height(1), leftChild(nullptr), 
                rightChild(nullptr) {
            }
        };
}
По образцу http://habrahabr.ru/post/150732/.
Как переписать функцию правого поворота? А конкретнее, какой тип переменных использовать при передаче?
Оригинал:
C++
1
2
3
4
5
6
7
8
9
node* rotateright(node* p) // правый поворот вокруг p
{
    node* q = p->left;
    p->left = q->right;
    q->right = p;
    fixheight(p);
    fixheight(q);
    return q;
}
Я написал вот так:
C++
1
2
3
4
5
6
7
8
9
10
std::unique_ptr<Node> RotateRight(std::unique_ptr<Node> &node);
{
        std::unique_ptr<Node> leftChild = std::move(node->leftChild);
        node->leftChild = std::move(leftChild->rightChild);
        leftChild->rightChild = std::move(node);
        FixHeight(leftChild->rightChild.get());
        FixHeight(leftChild.get());
 
        return std::move(leftChild);
}
И еще функцию поиска узла с минимальным ключом.
Оригинал:
C++
1
2
3
4
node* findmin(node* p) // поиск узла с минимальным ключом в дереве p 
{
    return p->left?findmin(p->left):p;
}
Я написал вот так:
C++
1
2
3
std::unique_ptr<Node> FindNodeWithMinKey(std::unique_ptr<Node> &node) const {
 return node->leftChild ? FindNodeWithMinKey(node->leftChild) : std::move(node);
}
Проблема в том, что я запутался, когда я должен передавать в методы std::unique_ptr<Node> &node а когда обычные указатели Node *. Операция std::move(node); портит дерево. Я же не могу обходить дерево вот таким способом node = std::move(node->leftChild)?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2014, 22:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Умные указатели (C++):

умные указатели - C++
у меня например есть куча юнитов, у каждого из них есть указатель на игровой ресурс (допустим камень). Есть такая задумка: когда камень...

Умные указатели - C++
#include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;memory&gt; using namespace std; ...

Умные указатели - C++
Насколько я понял для того что бы предотвратить передачу права владения используют const. Код из примера: template &lt;class T&gt; ...

Умные указатели - C++
Правильно ли я понял, что умный указатель - это просто шаблон класса, содержащий в себе указатель Type *p и его delete в деструкторе?

Умные указатели - C++
Здравствуйте! вопрос указатель auto_ptr почитала литературу, там написано он считывает и удаляет ссылки, т.е. он получает какие-то...

Прата и умные указатели - C++
Читаю Прата С. - Язык программирования С++. Лекции и упражнения - 2011, стр. 886: Пишу, компилирую - получаю ошибки: Кто не прав...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7189 / 5363 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 17
05.02.2014, 23:16 #2
Может не тот тип указателя, может лучше shared_ptr<> ?
0
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
05.02.2014, 23:56  [ТС] #3
Цитата Сообщение от Avazart Посмотреть сообщение
Может не тот тип указателя, может лучше shared_ptr<> ?
Так поначалу и было, у меня есть работающий класс с shared_ptr, но мне сказали, что логичнее использовать unique_ptr<>. Я переписал, но программа стала выдавать ошибки из-за неправильного использования unique_ptr<>
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 23:56
Привет! Вот еще темы с ответами:

Умные указатели на структуру с шаблоном - C++
#pragma once #include &lt;vector&gt; #include &lt;memory&gt; using namespace std; template &lt;class T&gt; struct Selem ...

Умные указатели динамические выделены - C++
Всем привет! Вот интересный но дурацкий вопрос. Можно ли с умным указателем делать такие вещи: 1) динамические создавать объект...

Объясните как выделяется память под умные указатели - C++
Читаю книгу Праты, не могу понять этот абзац, а точнее применение операторов new и new и delete и delete с ними. Почему нельзя...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...


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

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

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