私の目標は、不均一なビンに離散化された 3D 空間を表現することです。
ビンには、任意の型の要素が含まれます (型は決定されます)。
ビン (またはビンが存在する間隔) を追加し、以前に追加されたビンと交差する場合、両方をマージする必要があります。
現在、ビン (間隔) を追加するだけで、その後、正しいビンに属する要素を取得するために繰り返し処理を行っていますが、将来的には要素/間隔を変更し、同時に要素にアクセスする必要があるかもしれません。
このデータ構造を使用するアルゴリズムは、時間効率がよいはずです。
これまで、可能な限り既存のライブラリとデータ構造を使用する傾向がありました。
Boost::ICL シームは便利ですが、マージに問題がある可能性があります。
今、私はラッパーでこれをやっています。2 つの次元 (Y、Z) とビンとしてのセットのみを持つ Fe:
class Set_wrapper : public boost::enable_shared_from_this<Set_wrapper>
{
public:
Set_wrapper() :
mValue(new boost::shared_ptr<std::set<int> >(new std::set<int>()))
{
}
Set_wrapper(const std::set<int> & s)
{
mValue.reset(new boost::shared_ptr<std::set<int> >(new std::set<int>(s)));
}
void operator+=(const Set_wrapper &s)
{
Set_wrapper* sp = (Set_wrapper*) &s;
(*sp->mValue)->insert((*mValue)->begin(), (*mValue)->end());
*mValue = *(sp->mValue);
}
bool operator==(const Set_wrapper &s) const
{
return *s.mValue == *mValue;
}
boost::shared_ptr<boost::shared_ptr<std::set<int>>> mValue;
};
typedef interval_map<double, Set_wrapper> ZMap;
class Z_map_wrapper : public boost::enable_shared_from_this<Z_map_wrapper>
{
public:
Z_map_wrapper() :
mValue(new boost::shared_ptr<ZMap>(new ZMap()))
{
}
Z_map_wrapper(const ZMap & s)
{
mValue.reset(new boost::shared_ptr<ZMap>(new ZMap(s)));
}
void operator+=(const Z_map_wrapper &s)
{
Z_map_wrapper* sp = (Z_map_wrapper*) &s;
for(auto it = (*mValue)->begin(); it != (*mValue)->end(); ++it)
{
*(*sp->mValue) += std::make_pair(it->first, it->second);
}
*mValue = *(sp->mValue);
}
bool operator==(const Z_map_wrapper &s) const
{
return *s.mValue == *mValue;
}
boost::shared_ptr<boost::shared_ptr<ZMap>> mValue;
};
typedef interval_map<double, Z_map_wrapper> YMap;
これは私にとって少しハッキーな縫い目です:-)
もう 1 つのオプションは、b ツリーまたはインターバル ツリー (cgal の fe) を使用して独自のデータ構造を作成することです。または、boost::icl の適応または拡張。しかし、私は最先端のプログラマーではありません。
だから私の質問は:
私のアプローチの醜さにもかかわらず...これはうまくいくのでしょうか、それとも特定の問題が発生する可能性がありますか?
より適切なデータ構造はありますか?
独自のデータ構造を実装する場合、何を考慮する必要がありますか?
ご協力ありがとうございました