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

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

Восстановить пароль Регистрация
 
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
05.02.2014, 22:34     Умные указатели #1
Пишу класс дерево поиска:
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)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2014, 22:34     Умные указатели
Посмотрите здесь:

C++ Через указатели на указатели посчитать сумму двух чисел и записать в третье
Умные указатели C++
Указатели и указатели на указатели, а также типы данных C++
Умные указатели C++
C++ умные указатели
C++ Компиляция Sqlite3.dll в Visual C++ 6. Нужны умные головы профессионалов
C++ хочу написать программу,нужны умные мозги)
C++ Умные указатели на структуру с шаблоном

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
05.02.2014, 23:16     Умные указатели #2
Может не тот тип указателя, может лучше shared_ptr<> ?
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<>
Yandex
Объявления
05.02.2014, 23:56     Умные указатели
Ответ Создать тему
Опции темы

Текущее время: 16:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru