Каждый узел содержит набор, который, я полагаю, реализован как сбалансированный
бинарное дерево поиска. Набор каждого узла должен оставаться фиксированным после этого
создание узла, до его использования при создании дочерних узлов этого узла.
Это довольно уникальный случай. Я бы рекомендовал вместо этого использовать std :: vector. (Нет на самом деле!) Код создания узла может по-прежнему использовать set
, а переключение на vector
в последнюю секунду. Тем не менее, vector
меньше и занимает лишь небольшое количество выделенных областей памяти (один, если вы используете reserve
), что делает алгоритм намного быстрее.
typedef unsigned int treekeytype;
typedef std::vector<unsigned int> minortreetype;
typedef std::pair<treekeytype, minortreetype> majornode
typedef std::set<treekeytype, minortreetype> majortype;
majortype majortree;
void func(majortype::iterator perform) {
std::set<unsigned int> results;
results.assign(perform->second.begin(), perform->second.end());
majortree[perform->first+1].assign(results.begin(), results.end()); //the only change is here
majortype::iterator next = majortree.find(perform->first+1);
func(next);
}
Вы даже можете использовать std::lower_bound
и std::upper_bound
, чтобы по-прежнему получать O (log (n)) доступ к памяти, поскольку она по-прежнему сортируется так же, как и набор, поэтому вы не потеряете эффективность. Это чистый выигрыш, если вам не нужно часто вставлять / удалять.
Боюсь, однако, что копирование каждого комплекта непомерно дорого.
Если этот страх вызван тем, что каждый набор содержит в основном те же узлы, что и его родители, и данные являются дорогостоящими (для копирования или в памяти, в зависимости от того, что из них), только с изменением нескольких узлов, вместо этого в поддеревьях должно быть указано std::shared_pointers
самих данных. Это означает, что сами данные не будут скопированы, только указатели.
Я понимаю, что это не то, к чему вы стремились с этим вопросом, но, как сказал Джеймс Канзе, я не знаю такого контейнера. Кроме, возможно, странного и опасного использования класса STL rope
. Обратите внимание, что я сказал и имел в виду STL, а не стандартную библиотеку C ++. Они разные.