0
#include <ext/hash_map>

using namespace std;

class hash_t : public __gnu_cxx::hash_map<const char*, list<time_t> > { };
hash_t hash;

...

この hash_map の使用に問題があります。キーとして使用する const char* im は、常にこの形式 58412xxxxxxx の 12 の長さの数値です。483809 の異なる番号があることはわかっているので、すべてを挿入した後の hash_map のサイズになるはずですが、193 エントリしか取得できません。

hash_t::iterator it = hash.find(origen.c_str());
if (it != hash.end()) { //Found

    x++;
    (*it).second.push_front(fecha);         
}
else { //Not found

    y++;
    list<time_t> lista(1, fecha);
    hash.insert(make_pair(origen.c_str(), lista));          
}  

同じ手順は、python辞書を使用して完全に機能します(正しい数のエントリを取得しています)が、c ++を使用しても閉じません。すべてのキーが 58412 で始まるため (実際にはほとんどすべてのキーですが、すべてではありません。それが、これらの 5 文字を切り刻みたくない理由です)、多くの衝突が発生する可能性はありますか?

4

2 に答える 2

4

const char*文字列比較の代わりにポインター比較があるため、キーには適していません(また、おそらくダングリングポインターがあり、の戻り値はc_str()長期間使用できません)。

hash_map<std::string, list<time_t> >代わりに使用してください。

于 2012-06-05T14:29:25.573 に答える
1

キーがchar*の場合、文字列ではなくポインターを比較しているため、ハッシュマップが期待どおりに動作しません。キーに使用することを検討してくださいconst std::string。辞書式順序を使用して比較されます。

于 2012-06-05T14:30:20.877 に答える