【问题标题】:How do I compare the std::map's body members?如何比较 std::map 的正文成员?
【发布时间】:2011-04-13 10:40:16
【问题描述】:

我根据 stl::map 中的键 A 保留结构 B。我正在编写基于旧值对上述地图主体的任何成员的任何更新的代码,我将打印一个警报。

我不知道该怎么做。我研究过互联网。任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 为了澄清这个问题,如果驻留在地图中的对象发生变化,您想要获得的代码将触发某种警报(什么类型?)?什么情况下应该触发该警报?警报应该是什么样的?
  • 对问题标题的一个更正是 stl::map。对这个问题的另一个更正是,如果作为地图主体的结构 B 的任何成员发生变化,我该如何检测呢?是否已经有可用的电话,或者我应该使用 if (b.x == b.second.x) 逐个检查成员?谢谢
  • @DavidRodriguez,不,我只想知道如何检测更改,我会在检测到更改后执行 printf。所以,我的问题是:是否有一个函数调用来检测(真或假之类的东西)上次地图的任何身体成员中的变化?现在有意义吗?
  • 我已投票结束,因为这个问题似乎与手头的问题无关。在阅读用户 cmets 关于 Tony 的回答之后,似乎问题应该是“我可以在不执行所有成员比较的情况下比较两个结构吗?”或相关的东西。当前问题的重点是std::map,它与问题无关,因此令人困惑。实际的问题是缺少关于实际结构是什么的信息(它是 POD 吗?它包含什么类型?)

标签: c++ stl map comparison compare


【解决方案1】:

如果用作键和值的类型定义了operator==,最简单的昂贵解决方案是保留映射的备份,然后比较两个映射:

std::map<key,value> the_map;
std::map<key,value> test_copy; // hidden from the rest of the code
                               // copied from the_map on particular instants
bool map_has_changed() {
   return the_map != test_copy;
}

【讨论】:

    【解决方案2】:
    struct foo 
    {
       // foo members
    };
    
    bool isEqual(const std::map<int,foo>& map1, const std::map<int,foo>& map2)
    {
       std::map<int,foo>::const_iterator itr1, itr2;
       for (itr1 = map1.begin(), itr2 = map2.begin(); itr1 != map1.end(), itr2 != map2.end(); itr1++, itr2++)
       {
          if (itr1->first != itr2->first) return false;
          if (!isEqual(itr1->second, itr2->second)) return false;
       }
       return true;
    }
    
    bool isEqual(const foo& f1, const foo& f2)
    {
       // some implementation that checks if f1 and f2 are equal
    }
    

    这个实现的缺点是它假设每个映射的成员都以相同的顺序(这意味着它们以相同的顺序插入)。如果它们可能是不同的顺序,那么您将需要为 std::map isEqual 执行类似的操作:

    bool isEqual(const std::map<int,foo>& map1, const std::map<int,foo>& map2)
    {
       std::map<int,foo>::const_iterator itr, temp;
       for (itr = map1.begin(); itr != map1.end(); itr++)
       {
          temp = map2.find(itr->first);
          if (!temp) return false;
          if (!isEqual(itr->second, temp->second)) return false;
       }
       return true;
    }
    

    第一个实现会更快,但它再次假设地图的顺序相同。

    【讨论】:

      【解决方案3】:

      您应该迭代地图并进行比较:

      std::map<int, std::string> my_map;
      int someint = 2;
      std::string mystr = "tony";
      std::map<int, std::string>::iterator it;
      
      for (it = my_map.begin(); it != my_map.end() it++)
      {
          if (it->first == someint) 
            { 
                //do something 
            }
      
          if (it->second == mystr) 
             { 
               // do something else 
             }
      }
      

      确保您的地图是否包含正确实施比较运算符的自定义对象。

      【讨论】:

      • 我的地图是 std::map my_map;
      • @user:如果你在你的问题中没有提到这一点,那我就不知道了,但是原理还是一样的
      • 我认为我在解释我的问题方面做得不好:我认为我的问题是我是否有 stl::map mymap1 和 stl::map mymap2 那么有没有一种批发方式(对于更好的词的 lakc)来比较 mymap1.somestructure 和 mymap2.somestructure 而不必逐个比较成员。提前感谢您的帮助。
      • @user553514:所以基本上你问的是一个与地图完全无关的问题,但标题是“如何比较 std::map 的身体成员”?获得答案的一半是提供您感兴趣的实际问题。
      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 2013-01-05
      • 1970-01-01
      • 2017-07-28
      • 2020-03-30
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      相关资源
      最近更新 更多