Quad-/octree データ構造があります。セルの子インデックス/ptrsを配列に格納しています。配列内の各位置は、親に対する子の位置を表します (例: 2D):
// _____________
// | | |
// | 2 | 3 |
// |_____|_____|
// | | |
// | 0 | 1 |
// |_____|_____|
// for each cell, 4 children are always stored in row-major order
std::vector<std::array<Integer,4>> children;
Integer
子の最大数は、型が表現できる値のサブセットであることを知っています。-1
したがって、 forInteger = int
やstd::numeric_limits<unsigned>::max()
forのような「魔法の」値を使用して、セルに子がないかどうかを識別できますInteger = unsigned
。これはstd::optional<Integer>
想定できないことです。
私が理解している限りでは、この魔法の値の使用は の存在理由の 1 つですstd::optional
。std::vector<std::optional<int>>
それでも、 in inner loops の性能が気になります。
そう、
のパフォーマンスは のパフォーマンス
std::vector<std::optional<int>>
より悪くなりstd::vector<int>
ますか? (私はすでに「存在しない」値の比較を行っています)。std::optional
または、 raw と同じパフォーマンスを提供するようにの実装を最適化できint
ますか? そしてどうやって?
関数の戻り値の型とマジック値をデータ構造に混在std::optional
させるのは、非常に悪い考えのように思えます。私は一貫性を保ち、どちらか一方を (少なくとも同じコンテキスト内で) 使用することを好みます。マジック ナンバーとの比較を実行する関数をオーバーロードすることはできますが、次のようにします。
template<T> bool is_valid(const T& t) {
return /* comparison with magic value for t */;
}
オプションタイプの場合。