2010-12-04 19 views
3

私は比較的複雑なデータ構造を構築しようとしています。私の目標は、テキスト文書から単語を読み取り、その単語といくつかの特定のプロパティをハッシュテーブルにインデックスすることです。表は、構造体のベクトルのベクトルから構成されます(ベクトル<ベクトル> vecName;)。これほど私は運が良かった。各ユニークワードは、ベクトル内のインデックス位置にハッシュされる。ベクトルの2番目の次元(構造体のベクトル)は、読み込み中のファイルに関する情報と、そのファイル内でその単語が見つかった場所を格納します。私が読んだ各ファイルについて、特定の単語が複数回見つかると、構造体の中でカウントが増え、整数の構造体のベクトルは、単語がファイルに格納されているすべての場所の情報を格納します。 構造体のベクトルを持つ構造体のベクトルのベクトルを構築できますか? (はい、実際に)

は私がの支援をしたいと思います2つの項目があります

  1. 誰もが私の提案よりも優れたデータ構造の実装のための提案を持っている場合、私は好奇心が強いです。この巨人の代わりにいくつかの独立したデータメンバーを含むクラスは、おそらくより有用でしょうか?
  2. コンパイルエラーの原因となっている構文エラーがあるか、単純にベクタークラスがサポートしていない構造体を作成しようとしているようです。

ここにcmpilationエラーがあります。すべての3つのエラーは、構造体の内部の構造体のベクトルを参照してください。

「クラスのstd ::ベクトル>」「theLoc」
「クラスのstd ::ベクトルは>」「theStart」という名前のメンバーを持っていないという名前のメンバーを持っていません
「クラスのstd ::ベクトル>は」という名前のメンバーを持っていない「theEnd」

EboMikeが示唆するように、私は、コードを微調整する場合は、元のエラーが離れて行くが、私はその後、取得:

は、私は別のエラーを取得します編集者が私がハイパーリンクを投稿していると思うので投稿できません。要約は次のとおりです: '' testProps.wordProps :: theWordLocのメンバ 'push_back'のリクエスト:theLoc、非クラス型 'int' *

ここに私のコードとダイアグラムへのリンクがあります。

http://iamkevinfrye.com/blog/wp-content/uploads/2010/10/MicroSearch-Hash-Table-Data-Structure-Diagram.png最初

#include <vector> 
#include <iterator> 
#include <algorithm> 
#include <iostream> 

using namespace std; 

struct wordLoc 
{ 
    int theLoc;      // the location of the word in theFile 
    int theStart;     // the beginning of the sentence 
    int theEnd;      // the end of the sentence 
}; 

struct wordProps     // stores word info to be placed in array 
{ 
    string theFile;    // stores the file where theWord is found 
    int theCount;     // increments with each occurence of theWord 
    vector <wordLoc> theWordLoc; // stores the wordLoc info for each occurence of theWord 
}; 

int main() 
{  
    int Tsize = 20000; 

    wordProps testProps; 
    testProps.theFile = "test1"; 
    testProps.theCount = 1; 
    testProps.theWordLoc.theLoc.push_back(200); 
    testProps.theWordLoc.theStart.push_back(1); 
    testProps.theWordLoc.theEnd.push_back(15); 

    vector < vector <wordProps> > theWordProps; 
    theWordProps.resize(Tsize); 

    theWordProps[0].push_back(testProps); 

    cout << "index[0] = " << theWordProps[0].front().theFile << endl; 
    cout << "index[0] = " << theWordProps[0].front().theCount << endl; 
    cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theLoc << endl; 
    cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theStart << endl; 
    cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theEnd << endl; 
    cout << "size of theWordProps[0] = " << theWordProps[0].size(); 

    cout << endl; 
} 
+2

「それは私がコンパイルエラーを引き起こしている構文エラーのいずれかを持っていることが表示されます」...エラーメッセージの全文を投稿してください。 –

答えて

1

私はデータ構造の設計上の選択については分かりませんが、それはhasmapにする以外はあなたのコードはほぼ正しいです!

チェックアウト私のコメント:testProps.theWordLoc.theLocであなたは、ベクターtheWordLoctheLocメンバーを参照している

int main() 
{  
    int Tsize = 20000; 

    wordProps testProps; 
    testProps.theFile = "test1"; 
    testProps.theCount = 1; 

    // create your wordLoc object 
    wordLoc wl; 
    wl.theLoc = 200; 
    wl.theStart = 1; 
    wl.theEnd = 15; 

    // put it into the vector 
    testProps.theWordLoc.push_back(wl); 

    vector < vector <wordProps> > theWordProps; 
    theWordProps.resize(Tsize); 

    theWordProps[0].push_back(testProps); 

    cout << "index[0] = " << theWordProps[0].front().theFile << endl; 
    cout << "index[0] = " << theWordProps[0].front().theCount << endl; 
    cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theLoc << endl; 
    cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theStart << endl; 
    cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theEnd << endl; 
    cout << "size of theWordProps[0] = " << theWordProps[0].size(); 

    cout << endl; 
} 
+0

ありがとうございました!これは完璧な意味を持ち、私はtestPropsをtheWordPropsに渡すときに同じタイプのロジックを使用していましたが、そこには少し霧があり、wordPropsにwlを渡すための同じパターンを見落としました。この小さな被害者を助けてくれてありがとう! :)今私はいくつかの残りを得ることができます! – fryeguy

3

コンパイルエラーが:あなたはおそらく、この行を参照している:私は、データ構造を参照してくださいどのように私のブログは)

testProps.theWordLoc.theLoc.push_back(200); 
testProps.theWordLoc.theStart.push_back(1); 
testProps.theWordLoc.theEnd.push_back(15); 

theWordLocは、AVでありますエクター、あなたがたとえば、そのように扱う必要がありますので:

testProps.theWordLoc[0].theLoc = 200; 

か、まだ何もありません場合:あなたの実際の質問に関しては

wordLoc wordLocData; 
worldLocData.theLoc = 200; 
worldLocData.theStart = 1; 
worldLocData.theEnd = 15; 
testProps.theWorldLoc.push_back(worldLocData); 

は:実行可能な解決策ということですか?はい、そうです。しかし、どのくらいのデータを取得する予定ですか?そしてそれはどれくらい永続的ですか?答えが「tons、long」の場合は、代わりにデータベースを使用します。 worldLocのテーブル、wordPropsのテーブル、上位レベルのベクトルのテーブルを用意してください。物事はもっと速くてきれいです。

また、私はトップレベルのベクトルが嫌いです。私はあなたがそこでやろうとしている構造を理解していません(私はダイアグラムを見てきました)が、代わりにハッシュマップを探しているように思えます。

+0

エラーのある元の投稿を編集しました。彼らはEboMike suggest.theWordLocがベクトルで、インデックスを必要としない.push_backメソッドを使用しようとしています。しかし、私は、インデックスを追加しようとし、別のエラーのセットを受け取りました。 – fryeguy

+0

データベースを使用していただきありがとうございます。とてもそそられる。残念なことに、これはデータ構造に関する研究プロジェクトの一部であり、効果的に私はデータベースを使用しています。私はそれを最初から構築しています...しかし、その点はまだ十分です。私はもっ​​と同意できませんでした。 – fryeguy

+0

あなたは本当にそれを考慮する必要があります。それは本当にあなたが使用すべきものなのですね。 Btwは、コンパイルエラーに関する答えを編集します - theLocはベクトルではないので、 "push_back"と言うことはできません。 – EboMike

1

。これは単に受け入れられない。 testProps.theWordLoc[0].theLocのようなものを使用してください。

+0

このコンテキストでは、ベクタークラスの.push_backメソッドが受け入れられず、theWordLocのメンバーにアクセスするためのインデックスを提供する必要があることをお勧めしますか? – fryeguy

+0

@fryeguy:もしあなたが 'push_back'を望むなら、' testProps.theWordLoc.push_back({wordLocのインスタンス}) 'を使用します。 'theWordLoc'はベクトルです。 –

+0

@fryeguyあなたはロジックが間違った方向にある。あなたのコードは 'testProps.theWordLoc.theLoc.push_back'と言っています。つまり、 'testProps'に行き、' theWordLoc'のメンバーを見つけて、* that *のtheLocメンバーを見つけて、** that **のメンバーの 'push_back'を探します。このコードは 'theWordLoc'で' theLoc'を見つけようとしますが、 'theWordLoc'は' std :: vector'であり、 'theLoc'はありません。 'theLoc'はあなたが' push_back'したいものです。 'theWordLoc'に' push_back 'したいので、あなたのコードは 'theWordLoc.push_back(' something here ')'のようになります。 –

0

多分、データ構造のために、ベクトルのトップlvlベクトルを置き換えるのであれば、マルチマップがあなたの友人かもしれません。

http://www.cplusplus.com/reference/stl/multimap/

+0

ハッシュ関数を使用してマルチマップに値を格納することはできますか?私は可能な限りBig-Oのクラスとしてテーブルを作成するために探しています。 – fryeguy

+0

私が投稿したリンクから、マルチマップ用のテンプレートを使用するときに、何かが完全に欠落していない場合、ハッシュ関数を含むことができるパラメータとしてComparerを与えることができます。挿入は、O(log(n))のようなもので、ハッシュO(1)で検索する必要があります。 – mPopp

関連する問題