各ノードにはセットが含まれています。これは、平衡二分探索木として実装されていると思います。各ノードのセットは、そのノードの作成後、そのノードの子の作成に使用する前に、固定されたままになります。
これは非常にユニークなケースです。代わりにstd::vectorを使用することをお勧めします。(実際にはありません!)コードは、ノードが引き続き使用できるように作成し、最後の1秒でにset
切り替えます。vector
ただし、vector
は小さく、必要なメモリ割り当ての数はごくわずか(を使用する場合は1つ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);
}
セットと同じようにソートされているため、O(log(n))メモリアクセスを使用して取得することもできstd::lower_bound
、std::upper_bound
効率が低下することはありません。頻繁に挿入/削除する必要がない限り、それは純粋な利益です。
ただし、各セットのコピーには法外な費用がかかるのではないかと心配しています。
各セットに親とほぼ同じノードが含まれていて、データにコストがかかり(コピーまたはメモリのいずれか)、変更されたノードが少ないためにこの恐れが生じる場合はstd::shared_pointers
、データ自体の代わりにサブツリーに含まれるようにします。これは、データ自体はコピーされず、ポインタのみがコピーされることを意味します。
これはあなたが質問で目指していたものではないことを私は理解していますが、JamesKanzeが言ったように、私はそのようなコンテナを知りません。rope
おそらくSTLのクラスの奇妙で危険な使用以外。標準のC++ライブラリではなく、STLを意味していることに注意してください。それらは異なります。