さらに、その言語で各単語が出現する単語頻度を含む、ある種の辞書を作成する必要があります。通常、これは std::unordered_map を使用して実装されますよね? ここにキャッチがあります...正規表現に準拠するすべての単語とその頻度を見つけたいのですが、パフォーマンスが私の最大の関心事です。
要素の範囲を繰り返し処理し、要素がパターンに一致するかどうかを要素ごとにチェックすることは避けられないと思います。したがって、マップの代わりにベクトルのペアを使用する方が賢明かもしれないと思いました。
using namespace std;
typedef vector<pair<string, double>> Dictionary
vector<Dictionary::const_iterator> index;
Dictionary dict;
...
for_each(index['d'], index['e'], DoSomething);
これにより、この場合は「d」で始まるすべての単語を効果的に反復処理できます。もちろん、これは、正規表現の最初の文字を既に知っている場合にのみ役立ちますが、そうではないことが多いと思います。また、不確実性なしで単語全体をすでに知っていて、その頻度を調べたいだけの場合は、それが見つかるまでセクション全体を反復する必要があります. 地図があればもっと早く調べることができます。たとえば、「deer」という単語を検索する場合
Dictionary::const_iterator it =
find_if(index['d'], index['e'], [] // Lambda
(pair<string, double> const &pr)
{
return pr.first == "deer";
});
まったく最適ではありません!解決策は、さまざまな状況で辞書のさまざまな実装を使用することかもしれません。メモリは大きな問題ではありませんが、これはばかげた回避策のように思えます。
助言がありますか?