2012-10-05 7 views
6

に値を使用して一致するキーを取得する方法を、私は、対応するIDを見つける必要があります。事前にありがとう!は私だけ前を使用した値の型</p> <pre><code>map<int id, struct_t*> table struct_t { int prev; int wt; string name; } </code></pre> <p>などの構造体とのマップを持って、マップC++

EDIT:

int key=0; 
for(auto it = table.begin(); it != table.end(); ++it) 
{ 
    if(table[(*it).first].prev == ?) 
} 

これは私の地図データがどのように見えるかです:各IDについて

id prev abundance thing 
1573 -1  0  book 
1864 1573 39  beds 
2075 1864 41  tray 
1760 2075 46  cups 

、私は次の一致するidを見つける必要があります。したがって、前の列の1573の場合は、一致する 'id'が1864である必要があります。また、std :: nextはデータセットに次の要素に一致するIDを持つことができないため動作しません。 !

お願いします。あなたがあなた自身をセットアップする必要がありますもちろん

#include <map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::map<int, std::string> m = { 
     std::make_pair(0, "zero"), std::make_pair(1, "one"), std::make_pair(2, "two") 
    }; 

    int key = 0; 
    for (auto &i : m) { 
     if (i.second == "two") { 
     key = i.first; 
     break; // to stop searching 
     } 
    } 

    std::cout << key << std::endl; 
} 

:私の上司は(!そのすでに3週間となって)

+0

'map'のキーは何ですか? – hmjd

+0

データタイプを意味していますか?それはint idです – snazziii

+3

マップは値ではなくキーで検索されることを意味します。たぶんあなたのデザインを調整するか、別の種類のコンテナを使用する必要があります。 – arnoo

答えて

5

に注意してください。

const int prevToFind = 10; 
auto findResult = std::find_if(std::begin(table), std::end(table), [&](const std::pair<int, struct_t*> &pair) 
{ 
    return pair.second->prev == prevToFind; 
}); 

int foundKey = 0; // You might want to initialise this to a value you know is invalid in your map 
struct_t *foundValue = nullptr 
if (findResult != std::end(table)) 
{ 
    foundKey = findResult->first; 
    foundValue = findResult->second; 

    // Now do something with the key or value! 
} 

あなたが持っているなら、私を知ってみましょう古いコンパイラではなく、述語クラスを使用するようにサンプルを更新することができます。当然のマップ上でループ

+0

私はAppleのLLVM 4.1コンパイラを持っているので、私はXcodeを使用しています – snazziii

+0

私は本当にこれを理解していない..私は構造体を必要としない、私はint型のキーが必要です。 – snazziii

+0

鍵が必要ですか?あなたのマップが後方にあるように聞こえます...上記のコードを簡単に変更できます(findResult-> firstを使用するだけです)。 –

3

単純なループがそれを行うことができます私はC++を学ぶために多くの時間を取っていることをすでに失望しています検索のためのif文。 あなたは現代のコンパイラ(ラムダをサポートしています)を持っていれば、あなたは次の操作を行うことができます(boost::bimap)双方向マップは解決策になる可能性が後押し、

+0

私は方向性を付け加えましたが、if文で何を比較するべきか分かりません! – snazziii

+0

'if(i.second-> prev == the_id_youre_looking_for)' – Hendrik

+0

これは受け入れられた答えよりもずっと簡単です。なぜこれでアップ票がないのか分かりません... –

3

は、トリックを行いますが、あなたはインデックスとして第2のマップを使用して検討する必要があります。

map<int,int> table_idx; 

あなたはtableに新しいエントリを追加するたびにあなたにもtable_idxを更新する必要がありますすべてprevに対応するidを格納します。 table_idxは、(N)時間ログでidを逆引き参照することができます:

int prev_for_id = table_idx[id]; 
+0

地図をルーピングするとどういう意味ですか? – snazziii

+0

私は上記の答えのいくつかで採用されているアプローチを参照していました。あなたが探している 'id'と' prev'フィールドが等しい値を見つけるまで、マップの各エントリを繰り返します。 – Hendrik

1

イムあなたがやろうとしているものを教えてしまう場合、それはいいだろうので、あなたが初心者で気持ちを取得多分あなたが間違った問題を解決しようとしているからです。
注目の地図は、値ではなくキーで検索するように設計されています。
あなたがこのように地図を検索することを主張するならば、あなたは確かにチェックアウトしたいと言われています。ブーストBimap

+0

はい、私は初心者です。私はこのプロジェクトに3週間苦労してきました!私は質問 – snazziii

+0

を更新するよ、あなたの問題を理解していると思う。私の頭の上から、最初にすべてのデータをマップに入れます(最初にユニット化された次のフィールドが追加されています)。それから、私は地図全体と、value.prev == Yのマップを実行します[Y] - > value.next = X – NoSenseEtAl

+0

XとYは何ですか? – snazziii

関連する問題