12

unordered_mapを使用しようとしています。ただし、一部のサーバーにはtr1ライブラリがありません。そのような場合は地図を使いたいです。そこで、次のいずれかの行を使用するヘッダーファイルを作成します。

typedef tr1::unordered_map hashmap;
typedef map hashmap;

私の問題は、ここでさまざまなタイプのマップを使用していることです。

map<string, string>
map<string, int>
map <string, map<string,int>> ..etc

typedefを使用してマップまたはunordered_mapをハッシュマップとしてエイリアスできる場合は、コードでマップをとして使用できhashmap<string, string>ますhashmap<int, int>

これを行う方法はありますか、またはもっと良い方法があれば私に提案してください。

ありがとうVinod

4

3 に答える 3

10

これには、いわゆるメタ関数を使用する必要があります。

template <typename Key, typename T>
struct hashmap {
    typedef std::unordered_map<Key, T> type;
    // or
    //typedef std::map<Key, T> type;
};

これは次のように使用されます。

hashmap<int, float>::type some_map;

これは非常に一般的なパターンです。C++0x では、改善されたusingステートメントを提供することでこれが多少簡単になりますが、現時点ではこれが最善です。

于 2011-06-13T14:46:17.327 に答える
2

C++98 および 03 はテンプレートの typedef をサポートしていませんが、C++0x を使用するとサポートできます。

以前のバージョンでは、値 typedef を持つテンプレート構造体を使用して、必要なことを行うことができます。

template <typename T1, typename T2>
struct hashmap
{
    typedef std::map<T1, T2> type;
};

これは説明を目的としたものであり、比較演算子とアロケーターをカバーするために追加のテンプレート パラメーターが必要になる場合があることに注意してください。

于 2011-06-13T14:46:18.327 に答える
2

これは c++0x で可能になりますが、現在、特殊化されていないテンプレートのエイリアシングはサポートされていません。参照: https://en.wikipedia.org/wiki/C%2B%2B0x#Template_aliases

回避策として、マクロを使用してマップ タイプを代用できます。つまり、次のようになります。

#ifdef HAVE_TR1
#include <tr1/unordered_map>
#define HASH_MAP std::tr1::unordered_map
#else
#include <map>
#define HASH_MAP std::map
#endif

関係のないことですが、エイリアスを「ASSOC_MAP」または「HASH_MAP」ではなく単に「MAP」と呼びます。後者の名前は、ハッシュを使用しているように聞こえ、O(log N) ではなく一定時間の挿入と削除があるとユーザーに思い込ませます。

于 2011-06-13T14:53:18.470 に答える