問題を抱えているコードの小さなセクションがあります。これまでのところ、words.txtを読み込んでから、各単語を出力するようにプログラムを設定しています。それを実行している間、二次衝突スキームを介して各単語を1回だけハッシュし、それをテーブルに格納できるようにするハッシュ関数が必要です。
質問する
338 次
2 に答える
2
std::hash
で使用される標準のハッシュ関数std::unordered_map
は優れています。別のものが必要な場合は、それを記述して、std::unordered_map
宣言の3番目のテンプレートパラメーターとして提供することで、確実に独自のものを提供できます。
とにかく、以下は、unordered_mapおよび標準ライブラリによって提供される他の機能を使用する場合にこれがいかに簡単であるかを示しています。
#include <iostream>
#include <fstream>
#include <string>
#include <unordered_map>
using namespace std;
int main(int argc, char *argv[])
{
// load map with our words and their counts
unordered_map<string, unsigned int> strs;
ifstream ifs("words.txt");
string str;
while (ifs >> str)
++strs[str];
ifs.close();
// output results (use a lambda if you're using C++11, which
// you likely are since we have unordered_map. I've provided
// this just to show how it is done prior to lambdas.
struct print_entry
{
ostream& os;
print_entry(ostream& os) : os(os) {};
// called by for_each for each map value.
typedef typename unordered_map<string, unsigned int>::value_type value_type;
void operator ()(const value_type& val) const
{
os << val.first << " : " << val.second << endl;
}
};
// walk map with for_each, printing each entry to cout
for_each(strs.begin(), strs.end(), print_entry(cout));
return EXIT_SUCCESS;
}
于 2012-12-19T01:13:31.860 に答える
1
std::unordered_mapが提供する標準のハッシュ関数を使用します
次に、単語を読んでそれらをマップに追加し、カウントをインクリメントするだけです(マップの値の部分(単語はマップの重要な部分です))。
于 2012-12-19T00:37:28.563 に答える