【问题标题】:C++ check if an object exists in two mapsC++ 检查一个对象是否存在于两个映射中
【发布时间】:2016-04-20 05:47:27
【问题描述】:

我有自己的对象

class my_object
{
  int id;
  bool state;
  string name;
  string vendor;
}

我想将我的对象存储到两个map 中以便足够快的参考。

std::map<string, my_object> map1;
std::map<string, my_object> map2;

最后,我想检查两个映射中是否存在我的对象的某些键:

for(each my_object m1 in map1 and my_object m2 in map2 have the same key)
//for example, key "Bob" have corresponding objects in map1 and map2
{
  if(m1.vendor == m2.vendor)
  {
    //do some work
  }
}

如何在两张地图中进行比较? 还是应该使用不同的数据结构?

更新: 感谢您的回复。 为什么我使用两个地图是因为两个不同的功能会产生地图:

function1() //returns map1;
function2() //returns map2;

两个映射中使用的键是 my_object 的 name 字段。对于“足够快的参考”,我认为如果map1有n个元素,map2有m个元素,我的计算时间是n*m吗?

【问题讨论】:

  • 两张map中的两个key是什么?一张地图是否由name 键入,另一张由vendor 键入?
  • 必须有一个解决方案,但它会非常有效。如果你告诉我们你想做什么,它可能会有所帮助。
  • 如果同一个键在两个映射中是否保证相同的对象?
  • @M.M 似乎不在 OP 案例中。我在逻辑上没有找到。
  • 虽然不是对这个问题的直接回答,但首先分析为什么你有两张地图可能会更好 - “为了足够快的参考”还有一些不足之处。事实证明,您实际上并不需要它,或者不同的容器效果更好。

标签: c++ dictionary


【解决方案1】:

你可以

for (const auto& m1 : map1) {
    auto i2 = map2.find(m1.first);
    if (i2 != map2.end() && m1.second.vendor == i2->second.vendor) {
        // do some work
    }
}

【讨论】:

    【解决方案2】:

    您可以遍历其中一个映射(如果元素数量可能显着变化并且性能很重要,则理想情况下您会选择较短的映射),同时在另一个映射中依次搜索每个键(使用 @ 987654321@).

    for (const auto& kv : map1)
    {
        auto it2 = map2.find(kv.first);
        if (it2 != map2.end() && kv.second.vendor == it2->second.vendor)
            ...do whatever...
    }
    

    【讨论】:

      【解决方案3】:

      这是一个程序,它将为两个映射中存在的每个键调用任意函数。它基于std::set_intersection 的示例实现。

      您可以修改 lambda 以执行您的 vendor 相等性测试或您想要的任何其他检查。

       #include <map>
       #include <string>
       #include <iostream>
      
       template<typename K, typename V1, typename V2, typename Func>
       void map_intersection(std::map<K,V1> const &m1, std::map<K,V2> const &m2, Func f)
       {
          auto it1 = m1.begin(), it2 = m2.begin();
      
          while (it1 != m1.end() && it2 != m2.end() ) {
               if (it1->first < it2->first) {
                   ++it1;
               } else  {
                   if (!(it2->first < it1->first)) {
                       f(it1->second, it2->second);
                   }
                   ++it2;
               }
           }  
       }
      
       int main()
       {
           std::map<std::string, std::string> map1 = { {"a", "apple"}, {"b", "bug"}, {"c", "car"} };
           std::map<std::string, std::string> map2 = { {"b", "boat"}, {"c", "car"} };
      
           map_intersection(map1, map2, [](std::string const &v1, std::string const &v2)
           {
               std::cout << "Same key: " << v1 << "," << v2 << '\n';
           });
       }
      

      输出:

      Same key: bug,boat
      Same key: car,car
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-18
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 2016-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多