3D(2D、4D)の規則的な長方形グリッドにハッシュ点を入れるために、C++ 11 std::unordered_mapを使いたいと思います。3D hasingのためのunordered_mapの最適な使用法:私はユニオンをキーとして使用する必要がありますか?
もともと私は手動梱包を行うと、次のようにインデックスを開梱した
inline int_fast64_t xyz2i(int_fast16_t ix, int_fast16_t iy, int_fast16_t iz){
return ix | (iy << 16) | (iz << 32);
}
inline void i2xyz(int_fast64_t i, int_fast16_t& ix, int_fast16_t& iy, int_fast16_t& iz){
iz=(i & 0xFF0000) >> 32;
iy=(i & 0x00FF00) >> 16;
ix=(i & 0x0000FF);
}
、私はunionsを使用すると、おそらく良いだろうことに気づい:
class NodeIndex4D{
public:
union{
struct{ int_fast16_t x,y,z,w; };
int_fast16_t array[4];
int_fast64_t i;
};
};
それでも、私はそのI感じていますそれを最善の方法でやってはいけません。 C++言語の機能は、おそらくこの目的のために使用することができます。
など。どのようなとても素敵ではありませんが、私のinsertNode
機能である:
std::unordered_map<int_fast64_t,Node> nodes;
Node& insertNode(int_fast16_t ix, int_fast16_t iy, int_fast16_t iz){
NodeIndex4D inod;
inod.x=ix; inod.y=iy; inod.z=iz; inod.w=0; // NOT SO NICE
int sz0 = nodes.size();
Node& node = nodes[inod.i]; // get valid reference (if new allocate, if old take it)
if(nodes.size() > sz0){ // new element
node.id = sz0;
index2pos({ix,iy,iz}, node.pos); // not relevant here
node.pos.add_mul(scaling, -0.5); // not relevant here
}
return node;
}
NodeIndex4D.i
上の標準ハッシュ関数を使用しますstd::unordered_map<NodeIndex4D,Node>
ような何かをするだろうことはできないのですか?
も私は部分的にポータブル方法は4 int16_t
の配列にint64_t
をエイリアスすることであろう Node& insertNode(NodeIndex4D inod)
としての私の挿入機能を定義し、Node& insertNode({ix,iy,iz,0})
ここで質問は何ですか? –
あなたの質問は何ですか?あなたの最後の質問に対する私の答えについてのフィードバックをいただけますか?あなたはそれを放棄したようです。 –
* "あまりにも良い" * - あなたは 'NodeIndex4D'のコンストラクタをオーバーロードしたり、いくつかの引数にデフォルト値で書くことができ、' NodeIndex4D inod {ix、iy、iz};を直接書くことができます。それでも 'union'の大きな問題はエイリアスです.C++は、' int16_t'フィールドを使って値を設定し、 'int_fast64_t i;'を使って値を読み込んだ場合、またはその逆の場合、未定義の動作をします。あなたの実装は、あなたのコードが確実に動作するかもしれないし、そうでないかもしれない独自の動作を規定しているかもしれないし、そうしていないかもしれない。あなたが移植性を気にしなければ、あなたのコンパイラドキュメントをチェックしなければならない。 –