整数(または列挙)キーと文字列値を持つ巨大な辞書を使用する必要があります。しかしこれは完全に一定です。実行時に変更する方法はありません。既存の辞書構造を使用するのではなく、コンパイル時に辞書データを取り出すための方法(テンプレートなどの使用)がありますか?C++で巨大で定数の辞書に使用するデータ構造
答えて
ClangとLLVMは、コード生成とプリプロセッサトリッキーの組み合わせを使用して、オブジェクトを含むテーブルを生成することで問題を解決しました。
自分の設定に応じて、どちらのステップもスキップできます。あなたが列挙型を生成することができ
今// records.inc
EXPAND_RECORD(Foo, "Foo", 4);
EXPAND_RECORD(Bar, "Bar", 18);
EXPAND_RECORD(Bar2, "Bar", 19);
、:たとえば、クランとLLVMで
// records.h
enum Record {
#define EXPAND_RECORD(Name, String, Value) Name,
#include "records.inc"
#undef EXPAND_RECORD
};
char const* getRecordName(Record r);
int getRecordValue(Record r);
// records.cpp
char const* getRecordName(Record r) {
switch(r) {
#define EXPAND_RECORD(Name, String, Value) case Name: return String;
#include "records.inc"
#undef EXPAND_RECORD
}
abort(); // unreachable, or you can return a "null" value
}
int getRecordValue(Record r) {
switch(r) {
#define EXPAND_RECORD(Name, String, Value) case Name: return Value;
#include "records.inc"
#undef EXPAND_RECORD
}
abort(); // unreachable, or you can return a "null" value
}
を、コード生成相は、より快適な定義ファイルからの.incを生成するために使用されます。
これはかなりうまくいきますが、列挙型の変更によって完全な再コンパイルが行われることに注意してください。列挙型が内部で使用されていても外部に流出することのない「コードセット」アプローチに行きたいと思うかもしれませんし、安定した値(enumのもの)がクライアントに提供されます(unsigned
)再コンパイルせずにライブラリ:彼らは安定している場合は問題はない古いコードを使用するように制限されます。
きっとあなたは、単にのようなヘッダファイルで、テンプレートパラメータで指定されたインデックス定数文字列に辞書を変換するためにsedを使用することができます。
template <int Index> struct Dictionary { static const char *entry; };
、フォームの多くの行を持つソースファイル:
template <> const char *Dictionary<5>::entry = "Entry for five";
一方、実際にメンテナンスの観点からこの作業を行いたいですか?変更されたすべての辞書エントリと膨大な実行可能ファイルサイズに対して再コンパイルが必要です。
のようになります。* Bloated *:エントリはどこかにある必要があります。少なくともROMに入れておくと、プログラムのさまざまなインスタンス間で重複しないことを意味します(DLL )。 *再コンパイル*:あなたが適切なインターフェースを持っていなければ、問題になる可能性があります。 –
自動コード生成はどうですか?構成ファイルまたはデータベース、またはソースが何であれ、C++ヘッダーコードを生成します。それはこのような何かを見ることができる:
#define MYCONST_1 "#00ff00"
#define MYCONST_10 "My other configuration string"
あなたは、単純なbashスクリプトまたはルビー/ pythonので変換を行うことができます(またはC++あなたはマゾであれば)、それはあなたの設定ファイルの複雑さに依存します。
次に、設定ファイルが変更されたときに自動的にヘッダファイルを作成するいくつかのmakeルールを作成します。
私は今までコメントしていないうちにいつも私を下降させる大きなファンを持っています。 –
これは申し訳ありませんが、私は当時調理していましたが、私はコメントを忘れてしまったのでしょうか?x最初に、これはenum <->文字列マッピングの1つのイオタには該当しません。 2番目の*リテラル/定数にはマクロを使用しないでください。より良い選択肢(extern constant、static constantなど)があります。 –
- 1. lex/yaccでの辞書データ構造の使用
- 2. STLを使用せずにC++辞書データ構造を実装する方法
- 3. Cでの辞書/マップ/キーと値のペアのデータ構造
- 4. C++で大規模で複雑な定数データ構造をエンコードする方法
- 5. プロジェクト構造の辞書
- 6. Python:マルチプロセッシングを使って巨大な辞書を共有する
- 7. "。" Cの構造変数の接頭辞?
- 8. C# - 設定ファイルに使用されるデータ構造
- 9. 辞書を実装するための最良のデータ構造ですか?
- 10. C#で使用するためのC++データ構造体/型(構造体、列挙型)を公開するには?
- 11. ランダム選択で巨大な辞書:iPhone Dev
- 12. 使用するC#データ構造体はどれですか?
- 13. 多数の読み書きがある巨大なデータのベストデータストア
- 14. 最高のデータ構造:辞書の配列、オブジェクトの配列?
- 15. どのC#データ構造を使用すべきですか?
- 16. 巨大なPython Pickle辞書をロードする
- 17. 機能/永続的な辞書データ構造の実装
- 18. C#でリモートサーバーから巨大なデータにアクセスする
- 19. Python辞書構造、速度の問題
- 20. コンパイル時のC++プログラムの巨大なデータ
- 21. C#のデータ構造とアルゴリズムの定義
- 22. Javaで定数階層データ構造を宣言するには?
- 23. CコードのC++データ構造
- 24. 辞書ファイル構造Open Spell-Checkers
- 25. "ランダムキー辞書"構造の実際の名前は何ですか?
- 26. Python:SQLクエリを辞書に保存する(Bit複雑なデータ構造)
- 27. C#でMicrosoft.Office.Interop.Excelを使用して巨大なデータを読み込む
- 28. C++でのデータ構造のマップ
- 29. C/C++ /データ構造オンラインテスト
- 30. C#で巨大ファイルを処理する
データはどこから来ますか?テンプレートは、たとえば、ファイルから読み取ることができません。だから答えは、おそらく、コンパイル時にこれを行うことはできません。 –
@Oli:ファイルは常に#includeできます。 –
コンパイルする前に、設定ファイルをC++ファイルに変換することはできません。自動コード生成によって問題が解決される可能性があります。 –