在地图中搜索结构元素



我是C++新手(也是英语(。我想在地图中搜索{1,2,3},如果存在,请在屏幕上打印TRUE但我不能我的代码在下面你可以帮我吗?

#include <iostream>
#include <map>
#include <iterator>
#define PKT_UNIT_MAX_LEN  10000
using namespace std;
struct PKT_UNIT
{
int len;
unsigned int checksum;
unsigned char data[PKT_UNIT_MAX_LEN];

};
int main()
{
 map<int,PKT_UNIT> maharan;
 maharan.insert(pair<int,PKT_UNIT>(1,{1,2,3}));
 map<int,PKT_UNIT> ::iterator it;
 it=maharan.begin();
 for(it=maharan.begin(); it != maharan.end(); it++ )
 {
  if (maharan.find(it)!=maharan.end())
  {
   if (it->second.len==1 && it->second.checksum==2 && it->second.data==3)
   cout<<"TRUE"<<endl;
  }
return 0;
}

map::find采用与key_type相当的东西,而不是mapped_type,当然也不是迭代器。搜索值不是std::map旨在支持的内容。您可以改用通用搜索算法。

bool operator==(const PKT_UNIT& lhs, const PKT_UNIT& rhs)
{
    return (lhs.len == rhs.len) 
        && (lhs.checksum == rhs.checksum) 
        && std::equal(lhs.data, lhs.data + lhs.len, rhs.data);
}
int main()
{
    PKT_UNIT needle{1,2,3};
    std::map<int,PKT_UNIT> maharan;
    maharan.insert(pair<int,PKT_UNIT>(1,needle));
    auto it = std::find_if(maharan.begin(), maharan.end(), [&needle](auto & item){ return item.second == needle; });
    if (it != maharan.end())
    {
        std::cout << "TRUE";
    }
    return 0;
}

您应该重载 PKT_UNIT 的相等运算符。然后,您应该使用std::map::find来查找所需的内容。

bool operator==(const PKT_UNIT& lhs, const PKT_UNIT& rhs)
{
    return (lhs.len == rhs.len) &&
           (lhs.checksum == rhs.checksum) &&
           std::equal(lhs.data,lhs.data + PKT_UNIT_MAX_LEN,rhs.data);
}

你可以做这样的事情:

PKT_UNIT goal {1,2,3};
for (const auto& e : maharan)
{
    if (e.second == goal)
    {
        std::cout << "TRUEn";
        break;
    }
}

另外,由于您似乎不需要密钥,也许您想使用std::set并使用搜索算法,或者std::unordered_set,在这种情况下,您根本不需要搜索算法。

最新更新