2016-10-16 6 views
3

64ビットキーでマップを実装する適切な方法は何かを知る必要があります。あまりにも多くのアイテムがあるわけではありません。十分な大きさのアドレス空間を持つさまざまなものに対して、さまざまなキーを使用するだけで済みます。とても速くする必要があります。Stringキーが遅すぎる可能性があります。これまでのところ私が試した:Haxe - シリアル化可能なInt64キー(ネイティブターゲット)を使用してマップを実装する適切な方法

明らかに動作しません
import haxe.Int64; 
import haxe.Unserializer; 
import haxe.Serializer; 

class Test { 
    static function main() { 

     var key:Int64 = 1 << 63 | 0x00000001; 

     var omap:Map<Int64, String> = new Map<Int64, String>(); 
     omap.set(key, "test"); 

     var smap:Map<Int64, String> = Unserializer.run(Serializer.run(omap)); 

     var key2:Int64 = 1 << 63 | 0x00000001; 
     trace(key+" "+smap.get(key2)); 
    } 
} 

http://try.haxe.org/#7CDb2

haxe.Int64は、オブジェクトのインスタンスを作成するため。 cpp.Int64を使うと何らかの理由で私のcppコードで32ビット整数に戻ってしまい、何が間違っているのかわからないからです。私はそれを64ビットに "強制"することができますか、それとも別の方法で行うべきですか?

答えて

1

EDIT:これは、現在、原因hxcppのバグ/現在の実装にネイティブターゲットに取り組んでいない:私は最も効率的な解決できないことがあり、この回避策/ラッパーを、考え出しhttps://github.com/HaxeFoundation/hxcpp/issues/523

、それがいるようです作業。

import haxe.Int64; 
import haxe.Unserializer; 
import haxe.Serializer; 

class Test { 
    static function main() { 

     var key:Int64 = Int64.make(1000,1); 

     var omap:Int64Map<String> = new Int64Map(); 
     omap.set(key, "test"); 

     var smap:Int64Map<String> = Unserializer.run(Serializer.run(omap)); 

     var key2:Int64 = Int64.make(1000,1); 
     trace(key+" "+smap.get(key2)); 
    } 
} 

class Int64Map<V> { 

    private var map:Map<Int64,V>; 

    public function new() : Void { 
     this.map = new Map<Int64,V>(); 
    } 

    public function set(key:Int64, value:V):Void { 
     this.map.set(key, value); 
    } 

    public inline function get(key:Int64):Null<V> { 
     var skey:Null<Int64> = getMapKey(key); 
     if (skey != null) return this.map.get(skey); 
     return null; 
    } 

    public inline function exists(key:Int64):Bool { 
     return (getMapKey(key) != null); 
    } 

    public function remove(key : Int64) : Bool { 
     var skey:Null<Int64> = getMapKey(key); 
     if (skey != null) return this.map.remove(skey); 
     return false; 
    } 

    public function keys() : Iterator<Int64> { 
     return this.map.keys(); 
    } 

    public function toString() : String { 
     return this.map.toString(); 
    } 

    public function iterator() : Iterator<V> { 
     return this.map.iterator(); 
    } 



    private function getMapKey(key:Int64):Null<Int64> { 
     for (ikey in this.map.keys()){ 
      if (Int64.eq(key, ikey)){ 
       return ikey; 
      } 
     } 
     return null; 
    } 

} 

http://try.haxe.org/#57686

+0

あなたは、キーの数が少ないだろうと述べたが、あなたのユースケースのためにOK線形検索のですか? 'haxe.ds.BalancedTree'やカスタムマップ(線形検索を行う確率が低い)がうまく動作しないでしょうか? –

+0

@jonasmalacofilhoおそらく、ありがとうと思います。 – wildfireheart

関連する問題