我需要建立某种字典,另外还包含每个单词在语言中出现的单词频率。通常,这将使用 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”开头的单词。当然,这只有在我已经知道我的正则表达式的第一个字母时才有帮助,而我认为这通常不是这种情况。另外,如果我已经毫无疑问地知道整个单词并且只想查找它的频率,我将不得不遍历整个部分,直到找到它。地图可以让我更快地查找它。例如,在寻找“鹿”这个词时
Dictionary::const_iterator it =
find_if(index['d'], index['e'], [] // Lambda
(pair<string, double> const &pr)
{
return pr.first == "deer";
});
根本不是最优的!一个解决方案可能是针对不同的情况使用不同的字典实现,即使内存不是大问题,这似乎是一个愚蠢的解决方法。
有什么建议么?