1

_bstr_t キー タイプの順序付けられていないマップがあります。したがって、このキー タイプはデフォルトではハッシュ関数でサポートされていないため、ファンクタを定義しました。

struct KeyHash {
    size_t operator()(const _bstr_t& key) const {
        return hash<LPCTSTR>()(key);
    }
};

次に、typedef を定義しました。

typedef unordered_map<_bstr_t, RecentInfo*, KeyHash> RecentInfoMap;

そして、問題が発生します:RecentInfoMapをデフォルトのコンストラクターでインスタンス化すると

RecentMapInfo rim;

その後、すべて正常に動作します。しかし、RecentInfoMap を初期バケット数でインスタンス化したい場合

RecentInfoMap rim(100);

その後、マップが機能しません。キーで値を取得できません。また、マップを使用する前に rim.rehash(100) を呼び出すと、機能しません。

私が間違っていることを説明してください。

更新: いくつかのコード例:

unordered_map<bstr_t, int, KeyHash> map;
_bstr_t t1("ORCL");
_bstr_t t2("ORCL");
map[t1] = 777;
map[t2] = 555;
fout << map[t1] << endl;
fout << map[t2] << endl;

すべて問題ありません: map[t1] と map[t2] は 1 つの値 555 を参照します。しかし、map が次のように定義されている場合

 unordered_map<bstr_t, int, KeyHash> map(100);

次に、エラーがあります: map には重複したキーが含まれており、map[t1] は 777 を参照し、map[t2] は 555 を参照しています。

このステートメント (rehash 呼び出しを使用) も重複キーを提供します。

unordered_map<bstr_t, int, KeyHash> map;
map.rehash(100);
4

2 に答える 2

1

何を再確認しKeyHash()(t1)KeyHash()(t2)戻ることをお勧めします。

最初のケースでまったく機能するのは、非常に(不)幸運かもしれません。私はこれらのウィンドウのデータ型についてあまり知らないので、これは暗闇の中のショットのようなものですが.

于 2013-06-28T16:31:59.903 に答える