2013-10-29 18 views
6

C++に変換する必要があるCがあります。C++で静的const配列の特定の要素を初期化する

それがない。このような何か:私は、アレイ内の任意の順序なしの要素の数百を持って実際に

enum 
{ 
    ELEM0, 
    ELEM1, 
    ELEM2, 
    ELEM3, 
    ELEM4, 
    MAX_ELEMS 
} 

#define LEN 16 

static const char lut[MAX_ELEMS][LEN] = 
{ 
    [ELEM2] = "Two", 
    [ELEM3] = "Three", 
    [ELEM1] = "One", 
    [ELEM4] = "Four", 
    [ELEM0] = "Zero" 
} 

。私は配列のエントリが適切なテキストの列挙を保証することを保証する必要があります。

-std = gnu ++ 11のような位置パラメータを使用して配列を初期化することはできますか?

+0

あなたがC++にこれを変換する必要が何を意味するのですか?このコードは、C++と同じようにC++と同じように動作しますが、C++で同じ結果を得るためのよりよい方法があるかどうか尋ねていますか?あなたは、その質問に対する答えを得るために、より多くの文脈を提供する必要があると思います。 – mattnewport

+0

私は指名子による配列の初期化は有効ではないと思ったC + +ですか? – Joe

+2

@mattnewport:構文はC99で_C99 designator_としてサポートされていますが、彼はC++ 11でも必要です。 – deepmax

答えて

3

番号gcc documentation,指定された初期化子はGNU C++には存在しません。

ISO C99では、配列のインデックスや構造体フィールド名を指定して任意の順序で要素を指定することができ、GNU CではこれをC89モードの拡張子としても使用できます。 この拡張はGNU C++では実装されていません。

(それは、時間を実行していますが)、これはあなたの問題を解決しない:

static const std::map<int, std::string> lut = 
{ 
    std::make_pair(ELEM2, "Two"), 
    std::make_pair(ELEM3, "Three"), 
    std::make_pair(ELEM1, "One"), 
}; 
+0

それは私が思っていたことのようなものです。私は以前のアプローチが飛べないことを知っていたので、もっと "C++"のアプローチがオプションのように思えました。既存のコードベースにどの程度うまく移植できるか、ということはまったくありません。ありがとう! – Joe

+0

unordered_mapは、元のコードに近いランタイムパフォーマンス特性を持つため、通常のマップよりも優れた選択肢です。 – mattnewport

+0

'std :: vector lut {MAX_ELEMS};'はより良い構造かもしれません。次に、前と同じようにインデックスを作成し、必要な順序で挿入することができます。小さな文字列の最適化では、構築中に1つ以上のヒープ割り当てを行いません。 – Graznarak

関連する問題