13

値型として構造体を持つマップがあります

map<int id, struct_t*> table

struct_t
{
int prev;
int wt;
string name;
}

prev のみを使用して、対応する ID を見つける必要があります。よろしくお願いします!

編集:

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

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

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

ID ごとに、一致する NEXT の ID を見つける必要があります。したがって、前の列の 1573 については、1864 である一致する 'id' を見つける必要があります。また、std::next は機能しません。これは、データ セットが必ずしも次の要素に一致する ID を持つとは限らないためです。これが役立つことを願っています!

助けてください!!! 私の上司は、私が C++ を学ぶのに非常に多くの時間を費やしていることにすでにがっかりしています (もう 3 週間も経ちました!)

4

5 に答える 5

12

最新のコンパイラ (ラムダをサポート) を使用している場合は、次のことができます。

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!
}

古いコンパイラをお持ちの場合はお知らせください。代わりに述語クラスを使用するように例を更新できます。

于 2012-10-05T08:50:44.310 に答える
7

もちろん、マップをループするとうまくいきますが、2 番目のマップをインデックスとして使用することを検討することもできます。

map<int,int> table_idx;

新しいエントリを に追加するたびに、すべてのに対応する を保存して、同様tableに更新する必要があります。次に、log(N) 時間で逆引きできるようにします。table_idxidprevtable_idxid

int prev_for_id = table_idx[id];
于 2012-10-05T08:53:16.950 に答える
7

単純なループでそれを行うことができます:

#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;
}

もちろん、検索用に独自の if ステートメントを設定する必要があります。ブースト双方向マップが解決策になる可能性があることに注意してください(boost::bimap

于 2012-10-05T08:43:54.800 に答える
1

私はあなたが初心者だと感じているので、間違った問題を解決しようとしている可能性があるため、何をしようとしているのか教えていただければ幸いです.
前述のように、マップは値ではなくキーで検索されるように設計されています。
そうは言っても、この方法でマップを検索することを主張する場合は、おそらくBoost Bimapをチェックしたくなるでしょう。

于 2012-10-05T08:55:39.597 に答える