C++ 如何比较std::map';谁的身体成员?

C++ 如何比较std::map';谁的身体成员?,c++,stl,map,comparison,compare,C++,Stl,Map,Comparison,Compare,我根据stl::map中的键a保留结构B。我正在编写代码,根据旧值对上述映射主体的任何成员进行的任何更新,我将打印一个警报 我不知道该怎么做。我研究过互联网。任何帮助都将不胜感激。谢谢。您应该迭代地图并进行比较: std::map<int, std::string> my_map; int someint = 2; std::string mystr = "tony"; std::map<int, std::string>::iterator it; for (it =

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


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

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

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\u map;
int-someint=2;
std::string mystr=“tony”;
std::map::it迭代器;
for(it=my_-map.begin();it!=my_-map.end()it++)
{
如果(it->first==someint)
{ 
//做点什么
}
if(it->second==mystr)
{ 
//做点别的
}
}

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

应迭代地图并进行比较:

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\u map;
int-someint=2;
std::string mystr=“tony”;
std::map::it迭代器;
for(it=my_-map.begin();it!=my_-map.end()it++)
{
如果(it->first==someint)
{ 
//做点什么
}
if(it->second==mystr)
{ 
//做点别的
}
}

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

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

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;
}
std::映射_映射;
标准::映射测试_拷贝;//对代码的其余部分隐藏
//从特定瞬间的_映射复制
布尔图已更改(){
返回映射!=测试拷贝;
}

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

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;
}
std::映射_映射;
标准::映射测试_拷贝;//对代码的其余部分隐藏
//从特定瞬间的_映射复制
布尔图已更改(){
返回映射!=测试拷贝;
}
struct foo
{
//富会员
};
布尔isEqual(常数标准::映射和映射1,常数标准::映射和映射2)
{
std::map::const_迭代器itr1,itr2;
对于(itr1=map1.begin(),itr2=map2.begin();itr1!=map1.end(),itr2!=map2.end();itr1++,itr2++)
{
如果(itr1->first!=itr2->first)返回false;
如果(!isEqual(itr1->second,itr2->second))返回false;
}
返回true;
}
布尔相等(恒富和f1,恒富和f2)
{
//检查f1和f2是否相等的一些实现
}
这种实现的缺点是,它假定每个映射的成员顺序相同(这意味着它们以相同的顺序插入到映射中)。如果它们可能是不同的顺序,那么您需要对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;
}
bool-isEqual(const-std::map&map1,const-std::map&map2)
{
std::map::const_迭代器itr,temp;
对于(itr=map1.begin();itr!=map1.end();itr++)
{
temp=map2.find(itr->first);
如果(!temp)返回false;
如果(!isEqual(itr->second,temp->second))返回false;
}
返回true;
}
第一个实现将更快,但它再次假定映射的顺序相同

structfoo
{
//富会员
};
布尔isEqual(常数标准::映射和映射1,常数标准::映射和映射2)
{
std::map::const_迭代器itr1,itr2;
对于(itr1=map1.begin(),itr2=map2.begin();itr1!=map1.end(),itr2!=map2.end();itr1++,itr2++)
{
如果(itr1->first!=itr2->first)返回false;
如果(!isEqual(itr1->second,itr2->second))返回false;
}
返回true;
}
布尔相等(恒富和f1,恒富和f2)
{
//检查f1和f2是否相等的一些实现
}
这种实现的缺点是,它假定每个映射的成员顺序相同(这意味着它们以相同的顺序插入到映射中)。如果它们可能是不同的顺序,那么您需要对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;
}
bool-isEqual(const-std::map&map1,const-std::map&map2)
{
std::map::const_迭代器itr,temp;
对于(itr=map1.begin();itr!=map1.end();itr++)
{
temp=map2.find(itr->first);
如果(!temp)返回false;
如果(!isEqual(itr->second,temp->second))返回false;
}
返回true;
}

第一个实现将更快,但它再次假定映射的顺序相同

为了澄清这个问题,您想要获得的是一段代码,如果地图中的对象发生更改,该代码将触发某种警报(什么类型?)?什么情况应该触发警报?警报应该是什么样的?对问题标题的一个更正是stl::map。对这个问题的另一个更正是,如果结构B的任何成员(即地图主体)发生变化,我如何检测到它?是否已经有了针对该问题的调用,或者我应该使用if(b.x==b.second.x)逐个检查成员?Thanks@DavidRodriguez,不,我只是想知道如何检测到更改,在检测到更改后,我将只执行printf。所以,我的问题是:是否有一个函数调用来检测(正确或错误的事情)上一次地图的身体成员中的任何一个变化??现在这样做有意义吗?我投票决定结束,因为这个问题似乎与手头的问题无关。在阅读了用户对Tony答案的评论之后,似乎问题应该是“我可以在不执行所有成员比较的情况下比较两个结构吗?”或者相关的问题。当前的问题集中在
std::map
上,它与问题无关,因此容易混淆。实际的问题是缺少关于实际结构是什么的信息(它是一个POD吗?它包含什么类型?)为了澄清这个问题,您想要获得的是一个代码,如果驻留在映射中的对象发生更改,它将触发某种警报(什么类型?)?什么