string key;
Tree *left;
Tree *right;
~Tree();
};
Хочу создать динамический массив указателей на корни деревьев. И чтобы когда обращался к элементу массива по индексу (например, arr[49]), получал элемент типа Tree *. Как это реализовать?
Лучше std::vector<std::unique_ptr<Tree>>
В след. раз задумаюсь об этом, но уже исписал 750 строк кода, реализовав весь необходимый функционал. Это было из расчета на то, что я сумею создать массив указателей
Вы даже не почувствуете замены
большинство методов вида: Tree * method_title (Tree *, ...);
Если замена на вектор юников действительно невозможна, то тогда что-то вроде: Tree** forest = new Tree*[n];
Сориентируйте, пожалуйста, что делаю не так? Функция: Tree * addElem(Tree * tree, string key, int info); Код для проверки: Tree** arr = new Tree*[5]; arr[1] = addElem(arr[1], "yep", 6); cout << arr[1]->key << " < - - - > " << arr[1]->info << endl; Результат не такой, как я ожидал - завершение программы с отрицательным кодом (yep < - - - > 6 - ожидаемый результат, но его нет).
Так new Tree*[5] это массив с мусором, обнули его или создай обьект Tree на месте каждого элемента
Изначально, когда мы память только выделили, у нас массив неинициализированных указателей. Подозреваю, что вам сначала нужно пройтись по arr и проинициализировать его корректными указателями
Там именно мусор? Не NULL?
А статический массив может содержать указатели на структуру?
Лучше, кстати, как "нулевое" значение указателя использовать nullptr, некоторое количество потенциальных проблем избежите.
nullptr - своего рода продвинутый NULL? Он также дает false в логических выражениях?
Динамическую память вообще лучше не трогать лишний раз. Доступ к ней не быстрый - кеш забивается. И все эти деревья, разбросанные по памяти смысла программировать нет, когда есть все библиотечное. Почитайте что-нибудь про "data-oriented design"
У меня получилось. Спасибо 🙏
Обсуждают сегодня