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,我需要找到一个匹配的“id”,即 1864。此外,std::next 不起作用,因为数据集不一定在下一个元素中具有匹配的 id。希望这会有所帮助!

请帮帮我!!!我的老板已经对我花这么多时间学习 C++ 感到失望(已经 3 周了!)

4

5 回答 5

12

如果您有一个现代编译器(支持 lambdas),您可以执行以下操作:

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

简单的循环可以做到:

#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 回答
7

循环遍历地图当然可以解决问题,但您可能需要考虑使用第二张地图作为索引:

map<int,int> table_idx;

每当您向其中添加新条目时,table您也需要更新table_idx,存储id对应于每个prev. table_idx然后将允许您反向查找idin log(N) 时间:

int prev_for_id = table_idx[id];
于 2012-10-05T08:53:16.950 回答
1

我感觉你是一个初学者,所以如果你能告诉我们你想做什么会很好,因为也许你正在尝试解决一个错误的问题。
如前所述,地图设计为按键搜索,而不是按值搜索。
话虽如此,如果您坚持以这种方式搜索地图,您可能会想查看Boost Bimap

于 2012-10-05T08:55:39.597 回答
0

是否无法使用以下内容生成反向映射

typedef std::map<int, struct_t*> map_t;
typedef std::map<struct_t*, int> reverse_map_t;

reverse_map_t get_reverse( map_t m )
{
    reverse_map_t r;
    for( const auto& p: m )
    {
        r[p.second] = p.first;
    }
    return r;
}
于 2021-07-19T13:51:11.243 回答