我有以下自己创建的数据类型:
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插入到我的数据结构中(参见问题部分上面的行),但是我无法访问矢量中的地图。
任何人都可以帮助我。
答案 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
感谢您的帮助;)