2016-09-06 4 views
1

私はベクトルに読み込まれているデータファイルを持っています。例:オブジェクトのベクトルは、将来のオブジェクトの使用を検索しますか?

West Ham 38 12 
Leicester City 38 13 

実際のファイルには、より多くの倍音が続いています。

vector<Team>newTeams; //vector of Team objects 

string homeName; 
cout << "Enter home team name: "; 
cin >> homeName; 
cout << endl; 

Team ht; 

for(Team team : newTeams) 
{ 
    if(team.getName() == homeTeam) 
    { 
     ht = team; 
    } 
} 

基本的に私はベクトルを通過し、特定のチーム名を探します。とにかく、以前に私が検索のこの種を使用しました。私がチーム名を見つけたら、私はチームをhtに割り当てました。その後、私はつまり、必要なデータを取得するには、HTを使用します。

ht.getHomeGamesPlayed(); 
ht.getPoints(); 
ht.getHomeGoalsScored(); 

だから、私の質問は:検索のためのより良い方法があります(名前+ doubleのベクトルの使用マップ?):?

map<name, vector<doubles>>; 

また、検索の大文字小文字を区別しないようにするにはどうすればよいですか?すなわち、私はLeicester CItyの代わりにleicesterを入力し、Leicester Cityは依然として選択されるでしょうか?

UPD: が、私はそれを考え出したようにあなたが興味があるなら、ここでのコードだようだ:

string homeName; 
cout << "Name: " << endl; 
cin >> homeName; 

Team ht; 

for (Team team : dataTable) { 
    if (strstr(team.getName().c_str(), homeName.c_str())) 
    { 
     ht = team; 
    } 
} 

私はLeicを入力したとき、私はleic入力するときだから、レスターシティ(ピック、それはdoesnの

+1

無関係、私はあなたがこのコードの複数の場所に意図願っていますどこにコピー割り当てが行われているかを示します。どうやらあなたのクラスはまだ*参考文献*をカバーしていません。 – WhozCraig

+0

小さいオブジェクトをコピーしているときは、コピーの割り当ては一般的に問題ありません....しかし、チームのconstは&よくなるかもしれません... – Exaeta

+0

@WhozCraig私の例でリファレンスを使用する方法を私に示すことができれば、幸せに学ぶ(私は今、クラスを取っていない、これはちょうど楽しみのためです) – illia

答えて

3

はい、std::mapが問題に適しています。だからstd::unordered_map

大文字と小文字を区別しない一致を得るには、マップキーとしてすべて大文字またはすべて小文字に変換された文字列を使用できます。その後、元の名前を別々に保管してください。

std::map<std::string, std::pair<std::string, std::vector<double>>> mymap; 

部分一致が必要な場合などです。 leicesterと入力するとLeicester Cityと表示されるため、現在使用しているベクターのアプローチが最適かもしれません。 の最初の部分とのみ一致させる必要がある場合は、を使用してmap::lower_boundを使用して検索の開始場所を見つけることができます。

1

この問題を解決する方法はいくつかあります。私が示唆しているのは、複数の入力位置を持つ基数ツリーです。

まず、マップを作成するか、オブジェクトを保持するセットを作成します。次に、与えられた幅の各部分一致を索引付けする基数木を作成します。

ABCDEのFGE

は、 "ABCDEのFGE"、 "BCDEのFGE"、 "CDEのFGE"、... "E" のエントリを作成します。あなたの(マルチ)マップ値を指しています。基数ツリーのプロパティを使用すると、与えられた接頭辞を持つすべての値を簡単に見つけることができます。高速検索を実行して、O(1)(またはOサイズの検索語のO(N) )あなたは固定された入力サイズを持っています。ただし、検索可能なマテリアルのサイズのO(n^2)でツリーの構成を調整すると、これを修正するために、索引付けされる検索語(たとえば50文字)のサイズを制限することができます。複数の検索が続く複数の検索(例:索引 "abcdefg" "cdefg"と "efg"、 "def"を検索するときに "def"と "ef"を検索すると、 "ef")

検索文字列が、少なくとも限り、幅はあなたがスキップようでなければならないことに注意してください、そうでなければ、ツリー全体を検索する必要があると思います。..

関連する問題