1

我有以下自己创建的数据类型:

typedef map<string, vector<map<string, vector<int> > > > Entry;

这应该代表以下数据结构:

Filename | vector<map<Word, vector<LineNumber> > > 

这意味着,每个 FileName 包含许多单词,每个单词包含 linNumbers。它代表多个文件的单词索引。

为此,假设我编写了一个仿函数,它应该将文件名、单词和 lnr 添加到我的数据结构中:

FileWordLineAdder(string fileName, Entry wordLnr, int lnr) : fileName(fileName), entries(wordLnr), lnr(lnr) {
}

void operator()(string word) {
    word = normalize(word);
    if (word.size() == 0)
        return;

    vector<map<string, vector<int> > >& wordLnr = entries[fileName];

/* PROBLEM START */

    //vector<int>& lnrs = wordLnr[word];
    //lnrs.push_back(lnr);

/* PROBLEM END*/
} // operator()

现在我可以将文件名插入到我的数据结构中(参见问题部分上面的行),但我无法访问向量中的地图。

谁能帮助我。

4

2 回答 2

4

我认为您过度设计了数据结构。对于“file -> word -> linenumbers”的索引,一个简单的:

Filename | map<Word, vector<LineNumber> >

IE

map<string/*filename*/, map<string/*word*/, vector<unsigned long/*lineNumber*/ > > >

可能就足够了。请注意,这个数据结构已经是整个索引。它不是“条目”,因此您的 typedef 可能命名错误。

(请注意,我删除了地图上的一层“矢量” - 我认为这是您问题的实际根源。对于vector<map<...>>文件名,您将有许多单词映射,您可能不知道哪一个地图可供选择。)

于 2013-03-17T09:52:42.547 回答
0

我的解决方案如下所示:

typedef map<string/*word*/, vector<unsigned long> /*lineNumber*/> IndexInnerMap;
typedef map<string/*filename*/, IndexInnerMap> Index;

    // Get innerMap of specific fileName
    IndexInnerMap& wordLnr = index[fileName];
    // Get vector<lineNumber> of specific word
    vector<unsigned long>& lnrs = wordLnr[word];
    // Add line number to vector
    if (lnrs.empty() || lnrs.back() != lnr) {
        lnrs.push_back(lnr);
    } // if

感谢您的帮助 ;)

于 2013-03-19T19:08:19.197 回答