每个节点都包含集合,我想它是作为平衡二叉搜索树实现的。每个节点的集合在创建该节点之后,在用于创建该节点的子节点之前应保持固定。
这是一个非常独特的案例。我建议改用 std::vector 。(真的没有!)创建节点的代码仍然可以使用 a set
,并在最后一秒切换到 a 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
andstd::upper_bound
仍然获得 O(log(n)) 内存访问,因为它的排序仍然与集合相同,因此您不会失去任何效率。只要您不需要频繁插入/删除,这就是纯粹的收益。
然而,我担心复制每套产品的成本过高。
如果这种担心是因为每个集合都包含与其父节点大部分相同的节点,并且数据成本很高(复制或在内存中,无论哪个),只有少数节点发生了变化,那么让子树包含std::shared_pointers
而不是数据本身。这意味着数据本身不会被复制,只有指针。
我意识到这不是您提出问题的目的,但正如 JamesKanze 所说,我不知道这样的容器。除了可能是对 STLrope
类的奇怪和危险的使用。请注意,我说的是 STL,而不是标准 C++ 库。他们是不同的。