2016-07-07 6 views
0

を使用して、ネストは、私は、このようなネスティング例えばマップ

if (scale < 2) {turn = "First"; 
} else if (scale < 5) {turn = "Second"; 
} else if (scale < 8) {turn = "Third"; 
} 

e.t.c

がどのようにマッピングを使用してそれを避けることができた場合は、他のは避けてください、それが条件ならば1を使用するために私を助けなければなりません。

+2

は、常に等距離(つまり、5-2 = 3,8-5 = 3)の限界ですか、これはちょうど偶然でしょうか? – user463035818

答えて

3

あなたも簡単な、ソートされた配列を使用することができます。

struct TurnRank 
{ 
    int rank; 
    const char* turn; 
}; 

bool RankComp(int lhs, const TurnRank& rhs) { return lhs < rhs.rank; } 

const TurnRank kTurnRank[] = { 
    {2, "First"}, 
    {5, "Second"}, 
    {8, "Third"}, 
}; 

これは、動的な割り当てを必要とせず、非常に読みやすいです。 scaleが常に有効であることをご確認した場合、checkage月を

// Predefined constants. 
const char *scaleNames[] = {"First", "First", "Second", "Second", 
    "Second", "Third", "Third", "Third"}; 
const int namesCount = sizeof(scaleNames)/sizeof(*scaleNames); 

<...> 

turn = (0 <= scale && scale < namesCount) ? scaleNames[scale] : "Unknown"; 

std::upper_boundを使用して、ルックアップのために今

、:

#include <algorithm> 
#include <iostream> 
#include <iterator> 

void print_turn(int rank) 
{ 
    auto first = std::begin(kTurnRank), last = std::end(kTurnRank); 
    auto it = std::upper_bound(first, last, rank, RankComp); 

    if (it == last) std::cout << "Error, rank " << rank << " too large!\n"; 
    else   std::cout << it->turn << "\n"; 
} 
+0

[デモ](https://ideone.com/I1hZzX) –

0

私が思うに、このようなものは、最高のパフォーマンスを提供することができますもちろん、省略されることもあります。

+0

配列インデックスを使用した直接マッピングは、きちんとしたトリックになります(例:ここではデモンストレーションを行っています(https://www.youtube.com/watch?v=rwOI1biZeD8 ))。しかし、負のキーには対応していません: –

+0

@KerrekSB O(N)の代わりにO(1)を使用し、バイナリ検索でO(logN)を実行すると、良いパフォーマンスが得られます。読むのは簡単です。これは 'static_assert'と組み合わせて、名前配列の拡張を忘れることはありません。ネガティブキーの動作は簡単に変更できます。多くの場合、良い方法ではありませんか? – ilotXXI

+0

はい、確かに便利なテクニック、つまりキーが密集しているときに便利です。 –