2012-03-22 21 views
0

トピックベースのパブリッシュ/サブスクライブシステムをC++で作成しています。 - これは、ゲームエンジンのためである std :: mapに型や構造体を格納する

  • イベントデータ(STD ::マップ

    1. イベントの種類(のstd ::文字列)
    2. エンティティID(unsigned int型):私の一般的な "イベント" クラスは、3つの部分を持っています<のstd ::文字列、???>)

    「イベントデータ」マップを移入するには、私はint型、文字列、またはのVector3(構造体)のように、任意のデータ型や構造体を保存できるようにする必要があり、いくつかの例を挙げる。これどうやってするの?または、おそらくこれを行うもっと良い方法があります...

    関連のないメモでは、イベントの種類とデータ名にchar *または文字列を使用する方が良いでしょうか?

  • +0

    とにかく 'std :: string'を使用します。 – Puppy

    +0

    なぜですか? (あなたの判断には疑問はない、ただ知りたい) – jmegaffin

    +0

    これは簡単で標準的で、バグを防ぐ。 char *が優れているエッジケースがあるかもしれませんが、std :: stringを使って正当化するのに十分な理由はほとんどありません。 – Showtime

    答えて

    3

    試したboost:any

    イベントタイプについて、なぜ文字列を使用していますか? std :: mapsは低いキー値から高いキー値にソートされて格納されます。 これは、内部的には文字列をソートすることを意味します。 できるだけシンプルにしておきましょう。列挙型を使用してください。特に、通知システムの基盤となることを考えれば、マップをはるかに高速にする必要があります。あなたが期待するようなマップが動作しませんので、

    最後に、あなたは、char型の*を使用したくない:

    char* key1 = "Hi"; 
    char* key2 = "Hi"; 
    unsigned int id; 
    std::map< char* ,unsigned int > mymap; 
    mymap.insert(std::pair<char*,unsigned int>(key1, id)); 
    mymap.insert(std::pair<char*,unsigned int>(key2, id)); //you've just created a duplicate entry 
    

    理由はKEY1とKEY2は、彼らがしているにもかかわらず、異なるアドレスを持っているということです同じ文字列。

    +0

    私はむしろenumを使用しないでください。そして、いいえ、私はBoostを使ったことはありません。私はそれを試してみましょう。 – jmegaffin

    +0

    ああ、ええ、それは理にかなっています。私はちょっとしたパフォーマンスの向上が必要だと思うならenumに切り替えるでしょう; – jmegaffin

    +0

    あなたのタイプのテキスト記述が必要なら、いつもstd :: string GetDescription(EventType t)の行に沿って関数を使うことができます。 – Carl

    関連する問題