1

私は次の独自の作成されたデータ型を持っています:

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 をデータ構造に挿入できます (問題セクションの上の行を参照) が、ベクター内のマップにアクセスできません。

誰でも私を助けてください。

4

2 に答える 2

4

データ構造を過剰に設計したと思います。「ファイル -> 単語 -> 行番号」のインデックスの場合は、次のように単純です。

Filename | map<Word, vector<LineNumber> >

すなわち

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

おそらく十分でしょう。このデータ構造はすでにインデックス全体であることに注意してください。「エントリ」ではないため、typedef の名前が間違っている可能性があります。

(マップ上にある「ベクター」の1つのレベルを削除したことに注意してください-それが実際の問題の原因だったと思います。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 に答える