访问向量中的地图:map <string,vector <map <string,=“”vector <int =“”>&gt; &GT; &GT; </串,>

时间:2013-03-17 09:48:18

标签: c++ map vector mapreduce

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

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

哪个代表以下数据结构:

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

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

为此,假设我编写了一个仿函数,它应该将fileName,word和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()

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

任何人都可以帮助我。

2 个答案:

答案 0 :(得分:4)

我认为您已经过度设计了数据结构。对于“file - &gt; word - &gt; linenumbers”的索引很简单:

Filename | map<Word, vector<LineNumber> >

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

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

(请注意,我删除了一个位于地图上的“矢量”级别 - 我认为这是您问题的实际来源。使用vector<map<...>>,您将拥有许多文字名称的字图,以及你可能不知道选择哪一张地图。)

答案 1 :(得分: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

感谢您的帮助;)