6

私の経験では、実世界で非負の整数のインデックスが提供されることはめったにありません。多くのことは数値化さえされていません。そして、数値で表現されたインデックスを使用する多くのものは、インデックスが 0 から始まりません。では、なぜ整数インデックス配列にまだ限定されているのでしょうか?

多分私は間違っているかもしれませんが、列挙型のインデックス付き配列は、数値インデックス付きの配列よりも適切であることが多いようです (列挙型は多くの場合、より正確な「現実の」表現であるため)。多くの場合、列挙型は比較的簡単にCスタイルの配列インデックスに変換できます...

enum Weekday = {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}

// hopefully C doesn't allow nonsequential enum values; else pray to God
// no one does something like setting Sunday = 4 and Saturday = 4096
int numberOfDays = Saturday-Sunday+1;

int hoursWorkedPerDay[numberOfDays];

hoursWorkedPerDay[(int)SUNDAY] = 0;
hoursWorkedPerDay[(int)MONDAY] = 8;
hoursWorkedPerDay[(int)TUESDAY] = 10;
hoursWorkedPerDay[(int)WEDNESDAY] = 6;
hoursWorkedPerDay[(int)THURSDAY] = 8;
hoursWorkedPerDay[(int)FRIDAY] = 8;
hoursWorkedPerDay[(int)SATURDAY] = 0;

...列挙型の数と配列のサイズの間で一貫性を維持する必要があります (ただし、「SUNDAY」には 0 よりも有効な整数マッピングがないため、これはひどい解決策ではありません)。さらに重要なことは、 、int にキャストできるものはすべてインデックスにドロップして、配列を操作できます。

// continued from above
void resetHours (void) {
    int i = 0;
    int hours = 0;
    for (i = 0; i<numberOfDays; i++) {
        hoursWorkedPerDay[hours] = i;
        // oops, should have been: "...[i] = hours;"
        // an enum-indexed implementation would have caught this
        // during compilation
    }
}

さらに、enum から int への変換全体は、不要に思える複雑なレイヤー全体です。

誰かが列挙型インデックスに妥当性があるかどうかを説明し、各アプローチの長所と短所を挙げてもらえますか? そして、もしそのような情報が存在するのなら、なぜこれほど便利に見える機能が C 標準から欠落しているのでしょうか?

4

2 に答える 2

3

本当に列挙型をインデックスとして使用したい場合は、整数値を明示的に宣言する必要があります。

一方、私は個人的にs.thを好みます。次のように、タイプ セーフ (つまり、醜いキャストがなくてもかまいません)。

std::map<Weekday,int> hoursWorkedPerDay;
于 2012-11-06T18:49:09.563 に答える
2
Sunday =0 //by default, if you won't mention explicit value then it would take 0

Saturday = 6 // as in your example

それで

int numberOfDays = Saturday-Sunday; // which is 6 

int hoursWorkedPerDay[numberOfDays]; 

配列には、値を保持する場所が 6 つしかありません。

hoursWorkedPerDay[(int)SUNDAY] = 0;
hoursWorkedPerDay[(int)MONDAY] = 8;
hoursWorkedPerDay[(int)TUESDAY] = 10;
hoursWorkedPerDay[(int)WEDNESDAY] = 6;
hoursWorkedPerDay[(int)THURSDAY] = 8;
hoursWorkedPerDay[(int)FRIDAY] = 8;
hoursWorkedPerDay[(int)SATURDAY] = 0;  

配列インデックス (6) の外へのアクセスは未定義の動作です

于 2012-11-06T18:49:07.760 に答える